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