如何在Matlab中比较两个不同维数的矩阵并得到相等行的频率?

如何在Matlab中比较两个不同维数的矩阵并得到相等行的频率?,matlab,matrix,comparison,Matlab,Matrix,Comparison,我在Matlab中有一个矩阵A,维度为hxk,一个矩阵B,维度为yxk。我想构造一个维度为yx1的向量C,在每行j中列出B(j,:)在a中出现的次数 如果您正在寻找完美的匹配,请使用带有bsxfun- C = squeeze(sum(all(bsxfun(@eq,A,permute(B,[3 2 1])),2),1)) 您还可以使用(来自统计工具箱): 另一种解决方案是使用ismember和accumarray A=[1 2 3; 4 5 6; 7 8 9; 1 2 3; 4 5 6; 10

我在Matlab中有一个矩阵
A
,维度为
hxk
,一个矩阵
B
,维度为
yxk
。我想构造一个维度为
yx1
的向量
C
,在每行
j
中列出
B(j,:)
a
中出现的次数

如果您正在寻找完美的匹配,请使用带有
bsxfun
-

C = squeeze(sum(all(bsxfun(@eq,A,permute(B,[3 2 1])),2),1))
您还可以使用(来自统计工具箱):


另一种解决方案是使用
ismember
accumarray

A=[1 2 3; 4 5 6; 7 8 9; 1 2 3; 4 5 6; 10 11 12; 7 8 9];
B=[1 2 3; 10 11 12; 3 4 5; 7 8 9];
[uB,aB,cB]=unique(B,'rows');
[~,LocB] = ismember(A,uB,'rows');
C = accumarray(nonzeros(LocB),1,[size(B,1),1]);
C=C(cB);
返回

C =

 2     1     0     2
或者一些疯狂的编码,在大多数情况下似乎更快:

[u,v,w]=unique([B;A],'rows');
wB=w(1:size(B,1));
wA=w(size(B,1)+1:end);
C=accumarray(wA,1,[numel(v),1]);
C=C(wB);

@Shai真的非常同意,并把它变成了一行感谢+1!所以你也有同样的想法。:-)嗯,我只是用随机数据做了一些比较,我没有得到与路易斯和迪瓦卡两次相同的结果。某处可能有个虫子。。。我只是看看!B中的非唯一行失败。我看到您对另一个问题的不完整和删除的答案,这“影响”了我的想法;):-)刚刚在
B
中发现重复条目的问题。已修复,应该是
numel(v)
[u,v,w]=unique([B;A],'rows');
wB=w(1:size(B,1));
wA=w(size(B,1)+1:end);
C=accumarray(wA,1,[numel(v),1]);
C=C(wB);