adding matrices inside a big matrix
조회 수: 2 (최근 30일)
이전 댓글 표시
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
댓글 수: 0
채택된 답변
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
2011년 11월 16일
Good catch!
Just add this line will do the same thing.
sum4x4 = reshape(sum4x4,size(sum4x4,2),size(sum4x4,1))'
추가 답변 (3개)
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);
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
2011년 11월 15일
in blkproc, did you change magic(16) to 'a'? the magic(16) was for demo purposes only.
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
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(:)));
댓글 수: 0
참고 항목
카테고리
Help Center 및 File Exchange에서 Lighting, Transparency, and Shading에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!