Den*_*ers 4 matlab moving-average
我需要在 for 循环内计算数据系列的移动平均值。我必须获得 N=9 天的移动平均值。我正在计算的数组是 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
Run Code Online (Sandbox Code Playgroud)
所以基本上,我计算我的平均值并用(错误的)移动平均值绘制它。我直接从 mathworks 网站上选择了“wts”值,所以这是不正确的。(来源:http ://www.mathworks.nl/help/econ/moving-average-trend-estimation.html )但我的问题是,我不明白这个“wts”是什么。有人能解释一下吗?如果它与值的权重有关:在这种情况下这是无效的。所有值的权重相同。
如果我这样做完全错误,我可以获得一些帮助吗?
我最诚挚的感谢。
还有两种选择:
1)filter
来自文档:
您可以使用它
filter来查找运行平均值,而无需使用 for 循环。此示例使用窗口大小 5 查找 16 元素向量的运行平均值。
data = [1:0.2:4]'; %'
windowSize = 5;
filter(ones(1,windowSize)/windowSize,1,data)
Run Code Online (Sandbox Code Playgroud)
2)smooth作为曲线拟合工具箱的一部分(在大多数情况下可用)
来自文档:
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');
Run Code Online (Sandbox Code Playgroud)
2016 年,MATLAB 添加了movmean计算移动平均值的函数:
N = 9;
M_moving_average = movmean(M,N)
Run Code Online (Sandbox Code Playgroud)