【问题标题】:Ordering equal rows except the last element with respect to the last column in Matlab相对于 Matlab 中的最后一列对除最后一个元素外的相同行进行排序
【发布时间】:2016-03-09 19:52:55
【问题描述】:

我对 Matlab 中的一段代码有疑问。假设我们有一个矩阵 维度mx4A

 A=[ 2 3 4 |1
     2 3 4 |0
     1 1 1 |0
     1 1 1 |1
     9 1 0 |0
     9 1 0 |0
     9 1 0 |1]

我想按降序排列行的前三个元素与第四列相等的行。因此,我想得到

 B=[ 2 3 4 |1
     2 3 4 |0
     1 1 1 |1
     1 1 1 |0
     9 1 0 |1
     9 1 0 |0
     9 1 0 |0]

【问题讨论】:

  • 我在想的是,如果行相等,那么对第四列重新排序会有什么好处?至于你想用这个做什么?
  • 一旦它们被重新排序,我只想用“唯一”保留第一次重复
  • @user3285148 如果这是您的最终目标,为什么不直接使用 unique(A, 'rows')
  • 唯一的保持第一个相等的行
  • 我觉得这对于你手头的更大问题来说有点过头了。请解释您要实现的目标,并且可能有直接的方法可以实现。复杂或棘手的代码很容易出现错误。

标签: arrays matlab sorting matrix


【解决方案1】:

实现此目的的一种方法是创建一个 M x 2 矩阵,您可以使用 sortrows 对其进行排序。 sortrows 对第一列进行排序,然后使用第二列来解决任何平局。第一列将是一个索引,用于表示A 的前三列的唯一组合。

对于您的示例数据,第一列将如下所示。

[~, ~, inds] = unique(A(:,1:3), 'rows', 'stable');

inds =

     1
     1
     2
     2
     3
     3
     3

然后,第二列是您要排序的列(您的第四列)。

cat(2, inds, A(:,4))

   1     1
   1     0
   2     0
   2     1
   3     0
   3     0
   3     1

现在我们要在此使用sortrows 并按升序对第一列进行排序,并按降序对第二列进行排序。

sorted = sortrows(cat(2, inds, A(:,4)), [1 -2])

   1     1
   1     0
   2     1
   2     0
   3     1
   3     0
   3     0

第二列对应于您在B 中显示的所需第四列。所以让我们简单地将它与A 的前三列连接起来创建B

B = cat(2, A(:,1:3), sorted(:,2))

   2     3     4     1
   2     3     4     0
   1     1     1     1
   1     1     1     0
   9     1     0     1
   9     1     0     0
   9     1     0     0

总结

因此,将所有这些放在一起,我们得到以下结果。

[~, ~, inds] = unique(A(:,1:3), 'rows', 'stable');
sorted = sortrows(cat(2, inds, A(:,4)), [1 -2]);
B = cat(2, A(:,1:3), sorted(:,2));

【讨论】:

    【解决方案2】:

    Se 下面使用splitapplay 的类似方法(在R2015b 中引入)

    A=[ 2 3 4 1
       2 3 4 0
       1 1 1 0
       1 1 1 1
       9 1 0 0
       9 1 0 0
       9 1 0 1];
    
    % Map first 3 columns to a single value
    aux = str2num(strcat(num2str(A(:,1)),num2str(A(:,2)),num2str(A(:,3))));
    
    % Find groups
    G = sort(findgroups(aux));
    
    % Sort groups of same value in descending order with respect to column 4
    sorted = splitapply(@(x,y) {[dec2base(x,10)-'0',sort(y,'descend')]}, aux, A(:,4), G );
    sorted = cell2mat(sorted)
    
    sorted =
    
       2     3     4     1
       2     3     4     0
       1     1     1     1
       1     1     1     0
       9     1     0     1
       9     1     0     0
       9     1     0     0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 2018-01-24
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      相关资源
      最近更新 更多