Sum variable size chunks in array

4 ビュー (過去 30 日間)
Tudorel Afilipoae
Tudorel Afilipoae 2019 年 3 月 20 日
コメント済み: Tudorel Afilipoae 2019 年 3 月 27 日
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!

採用された回答

Stephen23
Stephen23 2019 年 3 月 27 日
編集済み: Stephen23 2019 年 3 月 27 日
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 件のコメント
Stephen23
Stephen23 2019 年 3 月 27 日
@Tudorel Afilipoae: you can show your appreciation by accepting my answer.
Tudorel Afilipoae
Tudorel Afilipoae 2019 年 3 月 27 日
Sorry, I wasn't aware that I could do this after already having accepted another answer..
Anyaway, my pleasure and thanks again!

サインインしてコメントする。

その他の回答 (1 件)

Fangjun Jiang
Fangjun Jiang 2019 年 3 月 20 日
編集済み: Fangjun Jiang 2019 年 3 月 20 日
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 件のコメント
Tudorel Afilipoae
Tudorel Afilipoae 2019 年 3 月 27 日
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.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeCreating and Concatenating Matrices についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by