我有两个非常长的2D列表,名为“first_data *”和“second_data”,我想找到相同的元素并将它们放在列表“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 :(得分: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);
答案 1 :(得分: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);
答案 2 :(得分:0)
使用:
[c, ia, ib] = intersect(first_data(:, 2), second_data(:, 2));
final = second_data(ib,1);
注意:我没有对此进行测试,但它应该可以工作(至少可以进行行/列混合)
答案 3 :(得分:0)
所以你的两个数据集可以用以下元组完整描述?
由(i,j,data_1)
描述的“first_data” - 表示值data_1位于第i行,第j列
“{1}}
描述的”second_data“你想找到相同的元组吗?
将“first_data”和“second_data”转换为设置使用Bloom Filter表示“first_data”和“second_data”执行 set intersection ,并使用两个表示的按位AND获得基本上恒定的时间集交集。