Вычислить сумму определенных строк (на основе уникального идентификатора) в столбце без использования цикла for в MATLAB - PullRequest
3 голосов
/ 07 февраля 2011

У меня есть матрица:

raw = [ 2001 1000 ; 2001 2000 ; 2001 1000 ; 2001 1000 ; 2001 2000 ; 5555 nan ; 5555 10000 ; 5555 20000 ; 5555 5000 ; 5555 20000 ; 5555 30000 ; 7777 1000 ; 7777 2000 ; 7777 3000 ; 7777 nan] ;

Мне нужно найти сумму всех последних 4 строк в Col2 (для каждого uniqId) на основе уникальных идентификаторов, которые находятся в Col1.Col2 также может содержать NaN.Я хочу получить ответ:

[2001 nan; 2001 nan; 2001 nan; 2001 5000; 2001 6000; 5555 nan; 5555 nan; 5555 nan; 5555 nan; 5555 55000; 5555 75000; 7777 nan 7777 nan 7777 nan ; 7777 nan] ;

Необработанная матрица имеет только элементы, которые имеют> = 4 строки данных.Я НЕ МОГУ использовать цикл for.Пожалуйста, помогите мне с векторизованной формой, если это возможно.При необходимости я могу использовать цикл while.

Ответы [ 2 ]

4 голосов
/ 07 февраля 2011

Вы можете сделать это, используя функции UNIQUE и ACCUMARRAY .Далее предполагается, что в каждой группе будет как минимум 4 элемента.Любые значения NaN, присутствующие в исходных данных, приведут к значению NaN для окна суммирования, которое включает это значение:

[~,~,index] = unique(raw(:,1));  %# Get the indices for the unique values
sumFcn = @(x) {sum(hankel([nan(3,1); x(1:numel(x)-3)],...  %# Anonymous function
                          x(numel(x)-3:end)),2)};          %#   to get the sum
                                                           %#   over each window
                                                           %#   of four values
sumPerID = accumarray(index,raw(:,2),[],sumFcn);  %# Compute the windowed sum
                                                  %#   for each unique ID
raw(:,2) = vertcat(sumPerID{:})  %# Place the results back into the second
                                 %#   column of raw
raw =

        2001         NaN
        2001         NaN
        2001         NaN
        2001        5000
        2001        6000
        5555         NaN
        5555         NaN
        5555         NaN
        5555         NaN
        5555       55000
        5555       75000
        7777         NaN
        7777         NaN
        7777         NaN
        7777         NaN
0 голосов
/ 07 февраля 2011

Проверьте accumarray, это может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...