在Matlab中对行和进行排序的快速方法

时间:2013-09-10 14:04:50

标签: matlab

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

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中实现这一目标?

5 个答案:

答案 0 :(得分:7)

由于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

答案 1 :(得分:4)

我能想到的最丑陋的单行:

>> 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的技能不变是一种很好的做法。

答案 2 :(得分:2)

做一些非常简单的事情,如下面的

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)];

修改

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

让我们做一些矩阵乘法

>> 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