我想在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];
如果前两列相等,则对第三列求和。有没有一种简单的方法,不需要循环几次?
您可以使用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];
您可以使用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
解决方案发布时还没有出现。