2014-09-23 316 views
3

我需要在for循环内计算数据序列上的移动平均数。我必须得到N = 9天的移动平均数。我正在计算的阵列是365个值(M)的4个序列,它们本身就是另一组数据的平均值。我想绘制我的数据与一个阴谋的移动平均值的平均值。计算移动平均数

我用Google搜索了一下关于移动平均和“转化”命令,发现这点我尝试在我的代码:实现东西

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 

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

如果我这样做完全是错误的,我能得到一些帮助呢?

我最诚挚的感谢。

回答

3

使用CONV是实现移动平均一个很好的方式。在你使用的代码中,wts是你衡量每个值的权重(正如你猜测的那样)。该矢量的总和应该总是等于1。如果你想均匀加权每个值,做一个大小为N移动过滤器,那么你会想这样做

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

使用CONV“有效”的说法会导致有女士值较少比你有M.如果您不介意零填充的效果,请使用“相同”。如果你有信号处理工具箱,你可以使用cconv,如果你想尝试一个圆形的移动平均线。像

N = 7; 
wts = ones(N,1)/N; 
cconv(x,wts,N); 

应该工作。

如果您尚未阅读,请阅读convcconv文档以获取更多信息。

+0

感谢您的帮助,这个工作的! – 2014-09-23 19:52:54

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点,特别关注其余一半的权重的第一个和最后一个点。

+0

谢谢,我想我现在已经明白了! – 2014-09-23 19:52:21

4

有两个更多的选择:

1)filter

从DOC:

您可以使用filter找到一个正在运行的平均值,而无需使用一个for循环。 本示例使用窗口大小为5的 查找16元素向量的运行平均值。

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'); 
4

2016年MATLAB加入movmean函数计算移动平均线:

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