2013-02-24 116 views
1

我有兩個名爲「first_data *」和「second_data」的非常長的2D列表,我想找到相同的元素並將它們放在列表「final_data」中。我在這裏有一個MWE:查找二維數組中的公共元素

first_data = [1 2; 3 4]'; 
second_data = [1 2; 9 4]'; 


final = []; 
for i=1:length(first_data(:, 1)) 
    for j=1:length(second_data(:, 1)) 
     if(first_data(i, 2) == second_data(j, 2)) 
      final = [final first_data(i, 1)]; 
     end 
    end 
end 

這給了我2,根據需要。這是有效的,但對於非常大的數據集來說,它非常計算密集。有沒有更有效的方法來編寫上述代碼?

+0

您確定示例代碼有效嗎?你聲明'final_data'並在'if'塊中將其引用爲'final'。這兩個數組的示例輸入將會很有幫助,以防萬一我的答案解決方案無法爲您正確工作。 – harpun 2013-02-24 12:51:26

+0

@harpun我已經澄清了我的問題,並添加了一個可用的小示例 – BillyJean 2013-02-24 13:02:50

+0

數組中有三個常見元素。答案不應該是[1,2,4]而不是[2]? – harpun 2013-02-24 13:08:13

回答

1

ismember將讓你做你想要的。

%# identify the rows in first_data's second column 
%# that occur in second_data's second column 
goodIdx = ismember(first_data(:,2),second_data(:,2)); 

%# return the corresponding values of first_data's first column 
final = first_data(goodIdx,1); 
+0

goodIdx的形式爲[0 0 ... 1 ... 0],但是如果我手動調用final = first_data([0 1],1),那麼我得到一個錯誤。這是爲什麼? – BillyJean 2013-02-25 19:44:57

+1

@ niles_1710373:'goodIdx'是一個邏輯向量。 'final_data(邏輯([0 1]))'將起作用。 – Jonas 2013-02-25 19:50:46

0

使用:

[c, ia, ib] = intersect(first_data(:, 2), second_data(:, 2)); 
final = second_data(ib,1); 

注:我沒有測試過這一點,但它應該工作(至少到行/列mixups)

1

試試這個代碼:

first_data = [1 2; 3 4]'; 
second_data = [1 2; 9 4]'; 
diff_data=first_data-second_data; 
Ind=find(diff_data==0); 
final=first_data(Ind); 
0

所以你的兩個數據集可以完全由下列元組描述?通過(i,j,data_1)描述

「first_data」 - 這表明該值_1是由(i,j,data_2)

描述行i,j列

「second_data」你想找到這樣的元組是平等的嗎?

轉換「first_data」,並使用利用布隆過濾器的「first_data」和「second_data」表示,並使用獲得基本上恆定的時間設定交叉點的Bloom Filter

執行交集「second_data」到兩個表示的按位與。