Расчет промежуточного итога в Matlab

Я хотел бы взять промежуточный итог таблицы в Matlab. Если значения двух столбцов равны, возьмите значение и добавьте, если есть запись.

Если привести пример, исходная матрица выглядит следующим образом:

A = [1 2 3;
1 2 2;
1 4 1;
2 2 1;
2 2 3];

Вывод будет выглядеть следующим образом:

B = [1 2 5;
1 4 1;
2 2 4];

Если первые два столбца равны, просуммируйте третий столбец. Есть ли простой способ сделать это без повторения цикла несколько раз?


person user1921722    schedule 21.12.2012    source источник
comment
Добро пожаловать в Stack Overflow! Что вы пробовали?   -  person Corey Adler    schedule 21.12.2012


Ответы (2)


Вы можете сделать это с помощью комбинации unique и accumarray:

%# find unique rows and their corresponding indices in A
[uniqueRows,~,rowIdx]=unique(A(:,1:2),'rows');

%# for each group of unique rows, sum the values of the third column of A
subtotal = accumarray(rowIdx,A(:,3),[],@sum);

B = [uniqueRows,subtotal];
person Jonas    schedule 21.12.2012

Вы можете использовать unique для получения всех групп, затем splitapply для их суммирования.

[u, ~, iu] = unique( A(:,1:2), 'rows' ); % Get unique rows & their indices
sums = splitapply( @sum, A(:,3), iu );   % Sum all values according to unique indices

output = [u, sums]
% >> output = 
% output =
%   26     7   124
%   26     8   785
%   27     7   800

Это поздний ответ, потому что >повторяющийся вопрос только что был задан, поэтому я разместил его здесь. Обратите внимание, что splitapply был введен в R2015b, поэтому его не было, когда было опубликовано решение accumarray.

person Wolfie    schedule 09.08.2018