Create a moving average

Dirk

Dirk (view profile)

님이 질문을 제출함. 28 Jun 2013
최근 활동 Image Analyst

Image Analyst (view profile)

님이 댓글을 추가함. 30 Nov 2017
Andrei Bobrov

Andrei Bobrov (view profile)

님이 답변을 채택함.
Hi There, How can I calculate a moving average for a column of data. For instance i want to average the 50 points either side of each data point in my column. Thanks

로그인 to comment.

답변 수: 6

Answer by Andrei Bobrov

Andrei Bobrov (view profile)

on 28 Jun 2013

A - your data
L = filter(ones(101,1)/101,1,[A(:) zeros(50,1)]);
out = L(51:end);

댓글 수: 0

로그인 to comment.

Answer by Image Analyst

Image Analyst (view profile)

on 28 Jun 2013
Edited by Image Analyst

Image Analyst (view profile)

on 28 Jun 2013

For a 1D column vector:
movingAverage = conv(yourSignal, ones(101,1)/101, 'same');
For a 2D array of columns:
movingAverage = conv2(yourSignal, ones(101,1)/101, 'same');
If you don't want the central pixel to be included in the average and have ONLY the 50 on either side, use
kernel = ones(101,1)/100;
kernel(51) = 0;
movingAverage = conv(yourSignal, kernel, 'same');
Same for a 2D matrix except use conv2 instead of conv. conv() and conv2() are highly optimized and very fast.

표시 이전 댓글 수: 1
Image Analyst

Image Analyst (view profile)

on 29 Nov 2017
You divide by however many 1's there are in the kernel. If you don't then you're not getting the average. Remember the average is the sum divided by the number of elements in the sum. If you didn't have 101, then you'd simply be summing 101 values and the resulting image would be 101 times as bright rather than in the same intensity range as the original.
Nuchto

Nuchto (view profile)

on 30 Nov 2017
So you could use ones(101,1) first, and onces it is convolved you can divide by 101?
Image Analyst

Image Analyst (view profile)

on 30 Nov 2017
Yes.

로그인 to comment.

Answer by Grzegorz Knor

Grzegorz Knor (view profile)

on 7 Apr 2017

From MATLAB R2016a there is a function movmean which does not require additional toolboxes.

Image Analyst

Image Analyst (view profile)

on 7 Apr 2017
True, and it offers some edge handling options ('shrink', 'discard', 'fill') that conv2() does not have.
conv2() also does not require any toolboxes because it's in base MATLAB.

로그인 to comment.

Marc (view profile)

on 28 Jun 2013

If you have the financial toolbox, doc movavg()....
[Short, Long] = movavg(Asset, Lead, Lag, Alpha)

댓글 수: 0

로그인 to comment.

Answer by the cyclist

the cyclist (view profile)

on 28 Jun 2013

This page of the MATLAB documentation has an example of using the filter() command to calculate a moving average:

Dirk

Dirk (view profile)

on 28 Jun 2013
Thanks. The filter function is set to average data from the previous n measurements. Is there a simple way to specify a different averaging criteria? Thanks

로그인 to comment.