【问题标题】:How to compare in Matlab two matrices of different dimension and get the frequency of equal rows?如何在Matlab中比较两个不同维度的矩阵并获得相等行的频率?
【发布时间】:2014-08-06 13:13:39
【问题描述】:

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

【问题讨论】:

    标签: matlab matrix comparison


    【解决方案1】:

    如果您正在寻找完美匹配,bsxfun 的一种解决方案-

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

    【讨论】:

    • @Shai 真的不能再同意了,让它成为一个单线! :) 感谢 +1!
    【解决方案2】:

    您也可以使用pdist2(来自统计工具箱):

    C = sum(pdist2(A, B)==0);
    

    【讨论】:

      【解决方案3】:

      使用ismemberaccumarray 的另一种解决方案

      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);
      

      【讨论】:

      • 所以你有同样的想法。 :-)
      • 嗯。我只是对随机数据做了一些比较,两次都没有得到与 Luis 和 Divakar 相同的结果。某处可能有错误...我只是在检查!
      • B 中的非唯一行失败。我看到你对另一个问题的不完整和删除的答案,这“影响”了我的想法;)
      • :-) 刚刚发现B中有重复条目的问题。
      • 修好了,应该是numel(v)
      猜你喜欢
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多