在matlab中查找矩阵的多个对应行的索引

时间:2015-01-12 20:29:02

标签: matlab matrix

我有两个矩阵,我想找到Matrix B中的行索引,这些行在Matrix A中具有相同的行值。让我举一个简单的例子:

A=[1,2,3; 2,3,4; 3,5,7; 1,2,3; 1,2,3; 5,8,6];
B=[1,2,3; 29,3,4; 3,59,7; 1,29,3; 1,2,3; 5,8,6;1,2,3];

例如,对于矩阵A中的第一行,Matrix B中的row1,row5和row7是对应关系。 我写了下面的代码,但它没有返回所有在矩阵A中具有相同行值的索引,并且只返回其中一个(row7)!!

A_sorted = sort(A,2,'descend'); % sorting angles
B_sorted = sort(B,2,'descend');   % sorting angles
[~,indx]=ismember(A_sorted,B_sorted,'rows')

结果是

indx_2 =

 7
 0
 0
 7
 7
 6

这意味着矩阵A中的第一行,Matrix B中只有一行(第7行)可用!但正如你可以看到矩阵A中的第一行,矩阵B中有三个对应的行(第1行,第5行和第7行)

2 个答案:

答案 0 :(得分:2)

我认为最好的策略是将ismember应用于唯一行

%make matrix unique
[B_unique,B2,B3]=unique(B_sorted,'rows')
[~,indx]=ismember(A_sorted,B_unique,'rows')
%For each row in B_unique, get the corresponding indices in B_sorted
indx2=arrayfun(@(x)find(B3==x),indx,'uni',0)

答案 1 :(得分:1)

如果您想比较AB之间的所有行对,请使用

E = squeeze(all(bsxfun(@eq, A, permute(B, [3 2 1])), 2));

或等效

E = pdist2(A,B)==0;

在你的例子中,这给出了

E =
     1     0     0     0     1     0     1
     0     0     0     0     0     0     0
     0     0     0     0     0     0     0
     1     0     0     0     1     0     1
     1     0     0     0     1     0     1
     0     0     0     0     0     1     0

E(ia,ib)会告诉您ia的{​​{1}}行是否等于A的第ib行。