2016-01-15 48 views
0

我正在寫MATLAB代碼。數組universe具有遞增的整數(正數,不大於1000)作爲條目(不一定是連續的)。這可能是[3,10,20,24,25,100,120,...,1000]universe長度由200如何在不使用for-loop的情況下選擇所需的元素?

Candidates界定爲包含隨機選擇的條目的2-by-k陣列從universe,使得第一行進行排序,並針對各列中,第一行比所述第二行更小。它看起來像

Candidates = [3, 3, 20; 
       10,25,24] 

對於k=3。通常k小於1000.我知道如何在沒有for-loop的情況下生成Candidates

Nodes3-by-(n^2-n)陣列,其中第一和第二行具有從universe條目和排列,使得第一行的主鍵,第二行是二級密鑰。第三行沒有限制。它看起來像

Nodes = [3, 3, 3, 20, 20, 20, 24, 24, 24, 25, 25, 25; 
     20, 24, 25, 3, 24, 25, 3, 20, 25, 3, 20, 24; 
     1, 2, 3, 0, 0, 0, 0, 0, 0, 3, 2, 1] 

基本上第一行和第二行有同樣多套,而第一行是通過分組和第二行通過循環來分類排序。

問題是,我們如何從Nodes中選擇列,使得Nodes(1:2,i)出現在Candidates的列之一中?

用簡單的方式是

Result = []; 
k = 3; 
n = 4; 
j_start = 1; 
for i=1:(n^2-n) 
    for j=j_start:k 
    if isequal(Nodes(1:2,i),Candidates(:,j)) 
     Result = [Result,Nodes(:,i)]; 
     j_start = j+1; 
     break; 
    end; 
    end; 
end; 

我們可以不用for -loops?只要效率可以提高,任何解決方案(如hashtable,contianer)都是受歡迎的。

回答

0

您可以使用ismember但你必須要轉,因爲沒有'columns'標誌:

Results = Nodes(:, ismember(Nodes(1:2,:)', Candidates', 'rows')) 
相關問題