3

我想在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];

如果前两列相等,则对第三列求和。有没有一种简单的方法,无需循环多次?

4

2 回答 2

5

您可以使用 和 的组合来做到这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];
于 2012-12-21T14:27:50.733 回答
0

您可以使用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发布解决方案时并不存在。

于 2018-08-09T12:40:18.610 回答