ここに私が欲しいものの小さな例があります。次の配列があるとします。
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 のスキルを研ぎ澄ますには良い習慣です。
次のような非常に簡単なことをするだけです
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)];
編集
上記のコードを変更して、合計が最後の列に追加されるようにしました。最初に質問を読んだとき、これが要件であることに気づきませんでした。
これが@Shaiのものよりも醜いかどうかを判断するのはあなたに任せます:
fliplr(diff([sortrows(fliplr(-cumsum(A,2))) zeros(size(A,1),1) ],1,2))
行列の掛け算をしてみましょう
>> 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