【问题标题】:Non-repeated arrays in a matrix in matlabmatlab中矩阵中的非重复数组
【发布时间】:2014-05-30 16:43:13
【问题描述】:

我正在寻找矩阵中不重复的行。

假设:

A =

 8     1
 2     2
 2     2
 2     2
 2     2
 3     6
 5     7
 5     7

我想得到“B”,即:

B=

 8     1
 3     6

请注意 C=unique(A,'rows') 将为我们提供唯一的“A”行,其中包括重复和非重复的数组,并且只删除重复的行。意思是:

C =

 2     2
 3     6
 5     7
 8     1

“C”不是我要找的那个。

任何帮助将不胜感激!

【问题讨论】:

    标签: arrays matlab matrix unique non-repetitive


    【解决方案1】:

    使用unique的第二个和第三个输出如下:

    [~, ii, jj] = unique(A,'rows');
    kk = find(histc(jj,unique(jj))==1);
    B = A(sort(ii(kk)),:);
    

    或者使用这种更直接的基于bsxfun的方法:

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

    这两种方法非常普遍:A 可能有任意数量的列,并且可能包含非整数值。


    如果A 总是有两列并且只包含整数值,您也可以使用accumarray 来做到这一点,使用稀疏选项(第六个输入参数)以在值较大的情况下节省内存:

    [ii jj] = find(accumarray(A, 1, [], @sum, 0, true)==1);
    B = [ii jj];
    

    或者您可以使用sparse 代替accumarray

    [ii jj] = find(sparse(A(:,1),A(:,2),1)==1);
    B = [ii jj];
    

    【讨论】:

    • 认为您可以节省 bsxfun 方法中的转置 - A(sum(squeeze(all(bsxfun(@eq, A, permute(A, [3 2 1])),2)))==1,:) 当然为此 +1 :)
    • @Divakar 谢谢!你是对的。但是保存.' 会引入一个,2。我更喜欢.'。此外,它可能有助于引起人们对the meaning of .'的关注
    • 哈哈厚脸皮那个!所以试图避免 sum(..,2),这是性能问题吗?因为转置必须有一些开销,但是 sum(..,2) 超过 sum() 比偷听的要大吗?我不知道这些的性能变化。
    • @Divakar 沿列求和比沿行或更高暗度求和更快。我很确定。原因是 Matlab 以列优先顺序存储数组。但是节省的时间应该与转置所需的时间相平衡。
    【解决方案2】:

    如果你不关心行的顺序,试试这个 -

    [C,~,ic] = unique(A,'rows','legacy')
    B = C(histc(ic,unique(ic))==1,:)
    

    【讨论】:

      猜你喜欢
      • 2018-02-13
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多