我有两个矩阵,我想找到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行)
答案 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)
如果您想比较A
和B
之间的所有行对,请使用
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
行。