3

Matlab では、各グループ (別の配列でラベル付けsubs) の配列の実行中の最大値を計算するにはどうすればよいですか? たとえば、配列subsを 3 人の生徒のラベルと考え、対応する値valをテストの点数として考えます。各生徒が達成した現在の最大得点を計算したいと思います。

>> subs = [1; 3; 1; 1; 3; 2];
>> val = [101 102 103 98 105 106];

目的の出力は、と同じサイズでval、その学生が達成した現在の最大スコアを示します。

output = [101, 102, 103, 103, 105, 106]

私のデータセットは非常に大きく、何百万ものエントリがあるため、for ループの使用を避けたいと考えています。各学生の全体的な最大スコアが必要な場合は、使用しますaccumarray(subs,val,[],@max)が、ここでは実行最大にしたいので、問題はより困難です。

Rにも同様の質問がありますが、Matlabでもできるようにしたいです。 Rでグループごとに実行中の最大値を見つける

ありがとう!

4

1 に答える 1

4

最新の Matlab バージョンをお持ちの場合は、次のように使用できaccumarrayますcummax。最初に並べ替えるsubs 必要があることに注意してください(もちろんvals、最後に同じ並べ替えを適用して元に戻す必要があります)。

[subsSorted, ind] = sort(subs); %// make sure grouping variable is sorted, so that
    %// accumarray is stable
result = accumarray(subsSorted, val(ind), [], @(x) {cummax(x).'}); %'// running max of
    %// each group is computed with cummax function
result = [result{:}]; %// concatenate
result(ind) = result; %// undo sorting
于 2015-12-10T01:10:07.340 に答える