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 版本,您可以accumarraycummax如下方式使用。请注意,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 回答