我需要在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"是。谁能解释一下?如果它与值的权重有关:在这种情况下无效。所有值都加权相同。
如果我这样做完全错了,我可以帮忙吗?
我最诚挚的谢意。
答案 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);
应该有用。
答案 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分,特别注意权重的一半和最后一个点。