【问题标题】:how to find row to row correspondence between two matrices in matlab如何在matlab中找到两个矩阵之间的行到行对应关系
【发布时间】:2014-01-06 22:05:01
【问题描述】:

我有两个矩阵

A=[1 3;4 5;7 8;17 11] 

B=[4 5;9 10;7 8;4 5;1 3;7 8;11 12]. 

我想得到两个矩阵的不同行之间的对应关系,就像

[I,J] = find(pdist2(A,B)==0);
display([I,J]). 

在我的情况下,A 和 B 的长度很大,因此执行 pdist2 的内存效率不高。 你能帮帮我吗?

【问题讨论】:

    标签: algorithm matlab matrix


    【解决方案1】:

    你可以使用ismember

    [tf, index]=ismember(B,A,'rows');
    

    其中索引包含 A 到 B 的相等行的索引,其他行的索引将为零 如果您想在 B 中获取这些行,请使用

    index(index==0) = []
    rows=A(index,:)
    

    查看http://www.mathworks.com/了解更多详情

    【讨论】:

      【解决方案2】:

      您可以使用bsxfun 完成此操作。它可能会比pdist2 花费更少的时间,但我不确定它是否会更节省内存:

      [I, J] = find(squeeze(all(bsxfun(@eq, A.', permute(B.',[1 3 2])))));
      

      【讨论】:

      • +1、findsqueezeallbsxfunpermute 在一行中......我猜你第一次没有得到那个正确的试试=P
      • @RobertP。不,但几乎 ;-)
      【解决方案3】:

      经验法则:如果您想要(内存)效率,并且您的需求无法通过标准 MATLAB 函数轻松解决,请实施自定义解决方案:

      inds = NaN(max(size(A,1),size(B,1)),2);
      kk = 1;
      for ii = 1:size(A,1)
          for jj = 1:size(B,1)
              if isequal(A(ii,:), B(jj,:))
                  inds(kk,:) = [ii,jj];
                  kk = kk+1;
              end
          end
      end
      inds = inds(1:kk-1,:)
      

      上面的双循环也是pdist2采取的方法。但是,pdist2 会计算 所有 距离,其中大部分是您不需要的,只是扔掉了。 Luis 采用的bsxfun 方法也是如此。

      这使得为您的特定目的使用pdist2 或 Luis 的解决方案相当于从伦敦经南极飞往巴黎,甚至没有欣赏美景——不是很快,而且确实很浪费 :)您的特定用例将是最快且最节省内存的。

      上面的双循环复杂度为 O(N²)。这似乎也是ismember 使用的方法(+1 到 Alyafey!)它比其他解决方案更快,内存效率更高,但是,我强烈怀疑 O(N·log(N)) 或更好是可能适用于您的特定情况。如果你必须在接下来的几周内在数百万个矩阵上解决这个问题数千次,我会花一些时间来找到最好的算法,或者证明这是不可能的:)

      【讨论】:

        【解决方案4】:

        最后我所做的是:

        [lib,loa] = ismember(B,A,'rows');
        
        loa(loa==0)=[];
        
        I = loa;
        
        J = find(lib);
        
        display([I,J]);
        

        我希望没有错误。最后很容易。非常感谢您的帮助。 :)

        【讨论】:

          猜你喜欢
          • 2019-03-08
          • 2021-09-20
          • 2017-04-15
          • 1970-01-01
          • 1970-01-01
          • 2016-03-27
          • 2018-08-31
          • 2013-06-25
          • 2015-08-28
          相关资源
          最近更新 更多