adding matrices inside a big matrix

3 ビュー (過去 30 日間)
j_solar
j_solar 2011 年 11 月 15 日
Hello everybody,
I am wandering if there is a way for not using loops to add many small matrices inside a big matrix. For example I have a big 40000x240000 matrix and I want to add all the numbers of 4x4 matrices inside that matrix, resulting in a 10000x60000 matrix.
thank you all for your answers

採用された回答

Sean de Wolski
Sean de Wolski 2011 年 11 月 15 日
And this fun answer:
sum4x4 = reshape(sum(reshape(reshape(sum(reshape(B,4,[])),size(B,1)/4,[])',4,[])),size(B)./4);
sum4x4 = reshape(sum4x4,size(sum4x4,2),size(sum4x4,1))'
where B is your matrix.
  6 件のコメント
Sean de Wolski
Sean de Wolski 2011 年 11 月 16 日
Good catch!
Just add this line will do the same thing.
sum4x4 = reshape(sum4x4,size(sum4x4,2),size(sum4x4,1))'
j_solar
j_solar 2011 年 11 月 17 日
yeah, actually,right after I posted my answer I changed it to what you now say! It is more elegant. :)

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

その他の回答 (3 件)

Fangjun Jiang
Fangjun Jiang 2011 年 11 月 15 日
Because the size of your matrix, you might want to re-use the matrix so replace the variable "e" and "f" with "d".
d=rand(40,24);
[M,N]=size(d);
e=mat2cell(d,4*ones(M/4,1),4*ones(N/4,1));
f=cellfun(@(x) sum(x(:)),e);
  1 件のコメント
j_solar
j_solar 2011 年 11 月 15 日
Yeah!!!! That works really well. Finally used a smaller matrix, 40x240 and its 2.2 times faster than with a loop. For bigger matrices this difference will probably increase BIG TIME!!!

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


Sean de Wolski
Sean de Wolski 2011 年 11 月 15 日
How about blkproc if you have the Image Processing Toolbox (or blockproc in newer versions).
blkproc(magic(16),[4 4], @(x)(sum(x(:))))
I'm surprised conversion to cell is faster than a well done for-loop. Perhaps you could post what you had for the nested for-loops?
  4 件のコメント
Sean de Wolski
Sean de Wolski 2011 年 11 月 15 日
in blkproc, did you change magic(16) to 'a'? the magic(16) was for demo purposes only.
Sean de Wolski
Sean de Wolski 2011 年 11 月 15 日
Your for-loop could be sped up a little by building the j-index vectors outside of the k for-loop. Overall it's good though!

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


Andrei Bobrov
Andrei Bobrov 2011 年 11 月 17 日
e.g.
A = randi(25,12,16);
m = 4;
n = 4;
[M,N] = size(A);
out = reshape(sum(sum(reshape(A.',n,N/n,m,[]),3)),n,[])';
or
out2 = reshape(sum(sum(reshape(A,m,M/m,n,[]),3)),[],n);
or2
out3 = blockproc(A,[m n],@(block_struct)sum(block_struct.data(:)));

カテゴリ

Help Center および File ExchangeLoops and Conditional Statements についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by