如何在matlab中获取矩阵的不同行

How to get distinct rows of a matrix in matlab

我有一个大矩阵和 MATLAB R2012b。我喜欢用它们的频率获得矩阵的不同行。怎么做?

此外,让我们认为具有相同条目的两行是相等的,即 $(0 , 0 , 1)$ 和 $(0 , 1 , 0)$ 是等价的。那么如何获取不同行的数量及其频率?

我正在尝试使用函数 sortrows()。但效率不高。我也不希望他们手动计数。

让我们定义一个示例矩阵:

A = [ 0 1 0;
      1 0 0;
      0 1 0;
      1 1 1];
  1. 如果 具有不同顺序的行应被视为不同的:使用 unique(...,'rows') to get unique row labels, and histc 进行计数:

    [~, jj, kk] = unique(A,'rows');
    unique_rows = A(jj,:);
    count = histc(kk, unique(kk));
    

    uniquejj 输出包含 A 的唯一行的索引。 kk 输出是一个标签,它告诉 A 的每一行,它等于 jj 给出的唯一行中的哪一行。换句话说,A(jj(kk),:) 重现 A(但仅使用 jj 给出的一组唯一行)。

    代码给出

    unique_rows =
         0     1     0
         1     0     0
         1     1     1
    
    count =
         2
         1
         1
    
  2. 如果 行应该被认为是相等的,即使它们的顺序不同:在调用 unique(...,'rows') 之前对每一行进行排序:

    [~, jj, kk] = unique(sort(A,2),'rows');
    unique_rows = A(jj,:);
    count = histc(kk, unique(kk));
    

    这给出了

    unique_rows =
         0     1     0
         1     1     1
    
    count =
         3
         1