Sum variable size chunks in array

4 visualizzazioni (ultimi 30 giorni)
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!

Risposta accettata

Stephen23
Stephen23 il 27 Mar 2019
Modificato: Stephen23 il 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 Commenti
Stephen23
Stephen23 il 27 Mar 2019
@Tudorel Afilipoae: you can show your appreciation by accepting my answer.
Tudorel Afilipoae
Tudorel Afilipoae il 27 Mar 2019
Sorry, I wasn't aware that I could do this after already having accepted another answer..
Anyaway, my pleasure and thanks again!

Accedi per commentare.

Più risposte (1)

Fangjun Jiang
Fangjun Jiang il 20 Mar 2019
Modificato: Fangjun Jiang il 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));
  1 Commento
Tudorel Afilipoae
Tudorel Afilipoae il 27 Mar 2019
Thank you very much for your answer, indeed this was the only way I could do it without using loops. Unfortunately, the use of the mat2cell function makes the speed of the entire process comparable with the one of a loop.

Accedi per commentare.

Categorie

Scopri di più su Creating and Concatenating Matrices in Help Center e File Exchange

Tag

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by