Moving average with overlapping windows
    4 次查看(过去 30 天)
  
       显示 更早的评论
    
Hi,
I am looking for an efficient way to compute a moving average with overlapping windows for a matrix X along the first dimension.
A non-efficient solution is the following.
 N = 3500000;
 X = randn(N,20);
 windowSize  = 600;
 stepSize    = 100;
 b = (1/windowSize)*ones(1,windowSize);
 a = 1;
 windowEnd = windowSize:stepSize:N-windowSize+1;
 tic
 X = filter(b,a,X) ;
 X = X(windowEnd)  ;
 toc
In this solution, I am computing a lot of averages that I am throwing away at the end... This is what I meant by 'non-efficient'.
Thank you in advance for your help.
0 个评论
回答(1 个)
  Image Analyst
      
      
 2016-3-25
        You can use blockproc() to move a 600x600 window along a matrix in "jumps" of 100. Look at all the arguments and let us know if you can't figure it out.
2 个评论
  Image Analyst
      
      
 2016-3-25
				
      编辑:Image Analyst
      
      
 2016-3-25
  
			You can use conv2() or imfilter(). They are very efficient and fast and highly optimized. However, they don't move in "jumps" of 100, they move by 1 pixel so they do a lot more computations. Whether it will be faster or not is for you to test.
tic;
kernel = ones(101) / 101^2;
blurredImage = conv2(X, kernel, 'same');
elapsedSeconds = toc
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

