【问题标题】:Quick way to sort an array with respect to row sum in Matlab在Matlab中根据行和对数组进行排序的快速方法
【发布时间】:2013-09-11 04:25:20
【问题描述】:

这是我想要的一个小例子。给定以下数组:

1 1 2
2 2 1
1 1 1
1 1 6

已排序(括号中显示行总和):

1 1 6 (8)
2 2 1 (5)
1 1 2 (4)
1 1 1 (3)

在 Matlab 中是否有快速实现此目的的方法?

【问题讨论】:

  • sort 返回排序矩阵和原始矩阵的顺序/索引(即足以重新创建原始矩阵)。所以只需对行总和进行排序,并使用排序从原始数据中选择行。
  • 排序需要更多的额外工作。我找到了一个 sortrows 的解决方案(更少的代码)。

标签: matlab


【解决方案1】:

由于sort 按顺序返回索引以及排序矩阵,您可以使用这些索引访问原始数据——试试这个:

% some data
A = [
  1 1 2;
  2 2 1;
  1 1 1;
  1 1 6;
];

% compute the row totals
row_totals = sum(A,2);

% sort the row totals (descending order)
[sorted, row_ids] = sort(row_totals, 'descend');

% and display the original data in that order (concatenated with the sums)
disp([A(row_ids,:), row_totals(row_ids)])

>>> 
 1     1     6     8
 2     2     1     5
 1     1     2     4
 1     1     1     3

【讨论】:

    【解决方案2】:

    我能想到的最丑的单线:

    >> subsref( sortrows( [sum(A,2) A], -1 ), struct('type','()','subs',{{':',1+(1:size(A,2))}}) )
    
    ans =
    
     1     1     6
     2     2     1
     1     1     2
     1     1     1
    

    免责声明:我不认为任何人都应该编写这种代码,但这是保持您的 Matlab 技能敏锐的好习惯。

    【讨论】:

    • @Shai Aha,你在处理subsref 参数中的秩序。
    • @MohsenNosratinia 确实,但 -1 参数要好得多。感谢您的提示。
    【解决方案3】:

    只需做一些非常简单的事情,如下所示

    temp = [1 1 2
            2 2 1
            1 1 1
            1 1 6];
    rowSums = sum(temp,2);
    [~,idx] = sort(rowSums,'descend');
    output = [temp(idx,:),rowSums(idx)];
    

    编辑

    更改了上面的代码以确保总和附加到最后一列。最初阅读问题时,我没有注意到这是一项要求。

    【讨论】:

    • 您的编辑没有到位,没有这个要求。如果是的话,单行就更简单了:sortrows( [temp, sum(temp,2)], -size(temp,2)+1 )
    • 哦,好吧。删除它就像添加它一样容易。所以不管
    【解决方案4】:

    我留给你判断这是否比@Shai的丑:

    fliplr(diff([sortrows(fliplr(-cumsum(A,2))) zeros(size(A,1),1) ],1,2))
    

    【讨论】:

      【解决方案5】:

      让我们做一些矩阵乘法

      >> sortrows([sum(A,2) A], -1)*[zeros(1,size(A,2)); eye(size(A,2))]
      

      返回

      ans =
           1     1     6
           2     2     1
           1     1     2
           1     1     1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-08
        • 1970-01-01
        • 2021-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-28
        相关资源
        最近更新 更多