2013-02-24 111 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”到两个表示的按位与。