这是我想要的一个小例子。给定以下数组:
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 中是否有一种快速的方法来实现这一点?
这是我想要的一个小例子。给定以下数组:
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
按顺序返回索引以及排序矩阵,因此您可以使用这些索引来访问原始数据——试试这个:
% 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
我能想到的最丑的单线:
>> 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 的丑:
fliplr(diff([sortrows(fliplr(-cumsum(A,2))) zeros(size(A,1),1) ],1,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)];
编辑
更改了上面的代码以确保总和附加到最后一列。当我最初阅读问题时,我没有注意到这是一项要求。
让我们做一些矩阵乘法
>> 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