Sum variable size chunks in array
4 views (last 30 days)
Show older comments
Tudorel Afilipoae
on 20 Mar 2019
Commented: Tudorel Afilipoae
on 27 Mar 2019
Hello,
I am looking for a vectorized way of summing variable size chunks in a matrix, for example I have some matrix
A = [1 2 3 4 5 6 7 8
3 4 2 2 8 4 2 9]
and I want to do a rowwise summation using some vector as a rule, for example
v = [2 3 3]
In this case the result would be a 2x3 where the first column would be the summation of the first 2 columns in A (according to v),
the second column would be the summation of the next 3 columns in A etc. I can think of various ways of doing this using loops
but I am wondering if there is a faster vectorized way of doing it ?
Thank you!
0 Comments
Accepted Answer
Stephen23
on 27 Mar 2019
Edited: Stephen23
on 27 Mar 2019
Avoiding duplicating the data in memory (i.e. avoid mat2cell) will probably be faster for larger matrices:
fun = @(c){sum(A(:,c),2)};
G = repelem(1:numel(V),V);
C = 1:numel(G);
Z = accumarray(G(:),C(:),[],fun);
Z = horzcat(Z{:});
If your matrix only has two (or a fixed, small number) of rows, then this is much faster:
G = repelem(1:numel(V),V);
Y = [accumarray(G(:),A(1,:).'),...
accumarray(G(:),A(2,:).')].';
Here are some timing tests (1e4 iterations):
Elapsed time is 9.600425 seconds. % single ACCUMARRAY call.
Elapsed time is 0.208772 seconds. % dual ACCUMARRAY call.
Elapsed time is 11.146120 seconds. % Fangjun Jiang's answer.
3 Comments
More Answers (1)
Fangjun Jiang
on 20 Mar 2019
Edited: Fangjun Jiang
on 20 Mar 2019
B=mat2cell(A,size(A,1),v);
C=cellfun(@(x) sum(x(:)),B)
or should be this
B=mat2cell(A,size(A,1),v);
C=cell2mat(cellfun(@(x) sum(x,2),B,'uni',0));
See Also
Categories
Find more on Creating and Concatenating Matrices in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!