2015-12-10 3 views
3

В Matlab, как вычислить рабочий максимум массива для каждой группы (помечен другим массивом subs)? Например, подумайте о массиве subs в качестве меток для 3-х учеников и соответствующих значениях в val в качестве тестовых оценок, я хочу вычислить текущий максимальный балл, достигнутый каждым учеником.Matlab running max по группам

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

Нужный выход имеет тот же размер, как val и дает текущий максимальный балл достигается тем, что студент:

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

Мой набор данных довольно большой, с миллионами записей, так что я хотел бы избежать используя for-loop. Если бы я просто хотел получить максимальный балл для каждого ученика, я бы использовал accumarray(subs,val,[],@max), но здесь проблема сложнее, так как я хочу работать максимум.

В R есть аналогичный вопрос, но я хотел бы иметь возможность сделать это в Matlab. Finding running maximum by group in R

Спасибо!

ответ

4

Если у вас есть последняя версия Matlab, вы можете использовать accumarray с cummax следующим образом. Обратите внимание, что subsneeds для сортировки сначала (и, конечно же, такая же сортировка должна быть применена к 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 
Смежные вопросы