计算移动平均线

时间:2014-09-23 19:05:53

标签: matlab moving-average

我需要在for循环中计算数据系列的移动平均值。我必须得到N = 9天的移动平均线。计算的阵列I是4个365值(M)系列,其本身是另一组数据的平均值。我想在一个图中用移动平均线绘制我的数据的平均值。

我搜索了一些关于移动平均线和" conv"命令并找到了我在我的代码中尝试实现的东西。:

hold on
for ii=1:4;
    M=mean(C{ii},2)
    wts = [1/24;repmat(1/12,11,1);1/24];
    Ms=conv(M,wts,'valid')
    plot(M)
    plot(Ms,'r')

end
hold off

所以基本上,我计算我的平均值并用(错误的)移动平均线绘制它。我选择了" wts"从mathworks站点开始,这是不正确的。 (来源:http://www.mathworks.nl/help/econ/moving-average-trend-estimation.html)我的问题是,我不明白这是什么" wts"是。谁能解释一下?如果它与值的权重有关:在这种情况下无效。所有值都加权相同。

如果我这样做完全错了,我可以帮忙吗?

我最诚挚的谢意。

4 个答案:

答案 0 :(得分:4)

还有两种选择:

1)filter

来自doc:

  

您可以使用filter查找不使用for循环的运行平均值。   此示例使用a查找16元素向量的运行平均值   窗口大小为5。

data = [1:0.2:4]'; %'
windowSize = 5;
filter(ones(1,windowSize)/windowSize,1,data)

2)smooth作为曲线拟合工具箱的一部分(大多数情况下都可用)

来自doc:

  

yy = smooth(y)使用移动平滑列向量y中的数据   平均过滤器。结果将在列向量yy中返回。该   移动平均线的默认跨度为5.

%// Create noisy data with outliers:

x = 15*rand(150,1); 
y = sin(x) + 0.5*(rand(size(x))-0.5);
y(ceil(length(x)*rand(2,1))) = 3;

%//  Smooth the data using the loess and rloess methods with a span of 10%:

yy1 = smooth(x,y,0.1,'loess');
yy2 = smooth(x,y,0.1,'rloess');

答案 1 :(得分:4)

2016年,MATLAB增加了计算移动平均线的movmean函数:

N = 9;
M_moving_average = movmean(M,N)

答案 2 :(得分:3)

使用conv是实现移动平均线的绝佳方法。在您使用的代码中,wts是您对每个值的权重(正如您猜测的那样)。该向量的总和应始终等于1。如果您希望均匀地对每个值进行加权并执行大小为N的移动过滤器,那么您需要执行

N = 7;
wts = ones(N,1)/N;
sum(wts) % result = 1

使用'有效' conv中的参数将导致Ms中的值少于M中的值。使用'相同'如果你不介意零填充的影响。如果你有信号处理工具箱,你可以使用cconv,如果你想尝试圆形移动平均线。像

这样的东西
N = 7;
wts = ones(N,1)/N;
cconv(x,wts,N);

应该有用。

如果您还没有更多信息,请阅读convcconv文档。

答案 3 :(得分:0)

我会用这个:

% does moving average on signal x, window size is w
function y = movingAverage(x, w)
   k = ones(1, w) / w
   y = conv(x, k, 'same');
end

here直接撕开。

评论您当前的实施情况。 wts是加权向量,来自Mathworks,平均为13分,特别注意权重的一半和最后一个点。