# 2D sliding/moving/running average window

64 views (last 30 days)

Show older comments

Albert Zurita
on 30 Jul 2022

Commented: Bruno Luong
on 25 Aug 2022

Hello, I want to perform a matrix 'patch' moving average but I am not sure how to. So, for example, defining my moving window as 3 x 3. I would like, for each element in the matrix, to perform the average of the elements as in the sequence below (excerpt) for an exemplary 6 x 10 matrix. I know this can be done more efficiently through the use of conv2 or in frequency domain with fft2, using the window kernel, but I still want to do it with a for loop, as this will be later translated to another real time language code. In addition, I would like to be able to select the elements as a 1D array (a reshape of the n_rows, n_cols matrix). At the edges of the matrix I select the next row, so it probably makes more sense to do it as a 1D array. Finally, when reaching the end of the matrix I can only select a few elements in the corner, but in this case I will do the average just of those elements.

thanks!!

### Accepted Answer

Bruno Luong
on 30 Jul 2022

Edited: Bruno Luong
on 30 Jul 2022

Just some hint if your want to implement efficiently using loop :

- To do mean, you might do sliding sum onf the data, then divide by sliding sum on the array of size data but values are replaced with 1s (ones(size(data)).
- The sliding 2D sum is "separable" meaning you just need to do sliding sum along one dimension, and apply the sliding sum along other dimension.
- The sliding sum in 1D can be donne efficiently by simply adding sum of the previous step with the new entry element and substract the one that exits the window. If ther data is "quantified" such as multiples of the 2^power something, this method does not have cumulative error, otherwise you might have a small cumulative error compared to standard sum on the whole windows.

##### 20 Comments

Bruno Luong
on 25 Aug 2022

Also you might change some of the hard-code first index

nan(1, ...

A(2:...

Bpad(1:end-1 ...

with expression using win(1)

### More Answers (2)

David Hill
on 30 Jul 2022

a=randi(100,15);%whatever initial size of your matrix

b=size(a,1);

m=zeros(b);

for x=1:b^2

idx=[x-b-1,x-1,x+b-1;x-b,x,x+b;x-b+1,x+1,x+b+1];

if idx(2,3)>b^2

idx(:,3)=[];

end

if mod(idx(3,2),b)==1

idx(3,:)=[];

end

if idx(2,1)<1

idx(:,1)=[];

end

if mod(idx(1,2),b)==0

idx(1,:)=[];

end

m(x)=mean(a(idx),'all');

end

Image Analyst
on 31 Jul 2022

Edited: Image Analyst
on 24 Aug 2022

### See Also

### Categories

### Community Treasure Hunt

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

Start Hunting!