Average every n*n elements in a two dimensional matrix
12 views (last 30 days)
I have a two dimensional matrix, and create a second matrix with the averages of every n*n elements. So, say I have a 100*100 matrix; I would want a 10*10 matrix where each single element is the average of the 10*10 elements in the original matrix at that location.
So far I have tried splitting the matrix into n separate row vectors, averaging each of those every n elements, concatenating and re averaging ever n of the averaged vectors. Then I concatenate each of those vectors. Is there a more efficient way to do this this, without using so many loops? It is very inefficient and inelegant for such a large matrix.
Sean de Wolski on 10 May 2013
Edited: Sean de Wolski on 10 May 2013
If you have the Image Processing Toolbox, you can use blockproc
And for more info:
Otherwise just use a double for-loop.
OR if you're curious to learn about vectorizing and speed is a top priority:
G = reshape(sum(reshape(sum(reshape(A,sz(1),blk(2),),2),blk(1),),1),sz./blk);
And broken into pieces:
A = magic(100);
blk = [10 10];
sz = size(A);
B = reshape(A,sz(1),blk(2),); %reshape so every blk column is a page
C = sum(B,2); %sum blocks across rows
D = reshape(C,blk(1),); %reshape so each column is a block
E = sum(D,1); %sum columns
F = reshape(E,sz./blk); %reshape to final size.