在更高效率的matlab中查找小数组的行索引

时间:2017-04-16 12:42:46

标签: arrays matlab performance

我有一个大小为3072 x 2的数组,我想在150000 x 2数组中找到行索引。例如,如果我们有

A =
     2     3 
     7     1 
     5     4 
     8     6 

B =
     1     4
     2     3 
     4     2
     7     1
     7     9
     0     1
     5     4 
    14    15 
    13    10 
     6     8
     8     6 

然后我想要输出,

b =
     2
     4
     7
     11

2 个答案:

答案 0 :(得分:3)

ismember'rows'参数一起使用:

A = [2     3;
    7     1 ;
    5     4 ;
    8     6 ];
B = [ 1     4;
    2     3 ;
    4     2;
    7     1;
    7     9;
    0     1;
    5     4 ;
    14    15 ;
    13    10 ;
    6     8;
    8     6 ];
b = find(ismember(B,A,'rows'))

答案 1 :(得分:2)

这是一种用于表现的方法 -

function out_idx = intersect_index(A,B)

s = max(max(A(:,1),[],1),max(B(:,1),[],1)) + 1;

A1D = A(:,2)*s + A(:,1);
B1D = B(:,2)*s + B(:,1);

BA1D = [B1D ; A1D];
[~,idx] = sort(BA1D);
out_idx = sort(idx(find(idx>numel(B1D))-1));

为了解释一下,我们可以将两个元素的每一行转换为标量,每个元素都将每一行视为索引元组,将1D个版本的输入作为A1D和{{1 }}。然后我们将这些数据附加到一个数组中:B1D并获取已排序的索引。由于排序,BA1D = [B1D ; A1D]的索引会有更高的索引,表明这些是我们需要查找的匹配项。这是这里的基本想法。

另请注意,如果A1DA中有负数,我们需要在开始时将B引入计算min

计时和验证

s