Matlab работает максимум по группе

В 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

Спасибо!

1 ответ

Решение

Если у вас есть последняя версия 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
Другие вопросы по тегам