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

finding indices of multiple corresponding rows of a matrix in matlab

我有两个矩阵,我想在矩阵 B 中找到行的索引,这些行在矩阵 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中的第一行,矩阵B中的row1、row5、row7是对应关系。 我写了下面的代码,但它不会 return 支持矩阵 A 中具有相同行值的所有索引,并且只支持其中一个(第 7 行)!!

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中的第一行,矩阵B中只有一行(第7行)可用!!但是正如您所见,对于矩阵 A 中的第一行,矩阵 B 中有三个对应的行(第 1 行、第 5 行和第 7 行)

我认为最好的策略是将 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)

如果要比较 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) 告诉您 A 的第 ia 行是否等于 B 的第 ib 行。