在2D数组中定位公共元素

时间:2013-02-24 12:23:28

标签: matlab iteration

我有两个非常长的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。这可行,但对于非常大的数据集来说,它是非常计算密集的。有没有更有效的方法来编写上面的代码?

4 个答案:

答案 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“

你想找到相同的元组吗?

使用Bloom Filter

将“first_data”和“second_data”转换为设置

使用Bloom Filter表示“first_data”和“second_data”执行 set intersection ,并使用两个表示的按位AND获得基本上恒定的时间集交集。