How to obtain total sum by group
43 ビュー (過去 30 日間)
古いコメントを表示
Hi, Could someone explain how to compute the total sum by group (without using for loop)?
A example is: groupid = [1; 1; 1; 2; 2; 3; 3;3]; value=[1;2;3;4;5;6;7;8]. the desired result is: runsum = [6;6;6;9;9; 21;21;21].
I am trying to get the result without using loop. Can "accumarray" do this?
Thanks a lot
Siying
0 件のコメント
採用された回答
Geoff Hayes
2015 年 12 月 18 日
Siying - yes, accumarray can be used to sum elements of the same group. For example, we can do
groupSums = accumarray(groupid,value);
which gives us
groupSums =
6
9
21
with your runsum as
runsum = groupSums(groupid);
3 件のコメント
Geoff Hayes
2015 年 12 月 22 日
Which is the matrix: the group ids or values, or both? Please provide an example.
その他の回答 (2 件)
jgg
2015 年 12 月 18 日
Yes. This should work; it's probably not the shortest way to do it, but it avoids looping.
key = unique(groupid);
tsum = accumarray(groupid,value);
[~,idx] = ismember(groupid,key);
runsum = tsum(idx);
0 件のコメント
Walter Roberson
2015 年 12 月 18 日
group_sum = accumarray(groupid, value);
runsum = group_sum(A);
Your question reminds me of the similar http://uk.mathworks.com/matlabcentral/answers/260501-unique-and-min-by-index
参考
カテゴリ
Help Center および File Exchange で Creating and Concatenating Matrices についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!