【问题标题】:Computing a moving average计算移动平均线
【发布时间】:2014-11-18 02:46:20
【问题描述】:

我需要在 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

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

如果我做错了,我能得到一些帮助吗?

最诚挚的感谢。

【问题讨论】:

    标签: matlab moving-average


    【解决方案1】:

    还有两种选择:

    1) filter

    来自文档:

    您可以使用filter 来查找运行平均值,而无需使用 for 循环。 此示例使用 16 元素向量查找运行平均值 窗口大小为 5。

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        在 conv 中使用 'valid' 参数将导致 Ms 中的值少于 M 中的值。如果您不介意零填充的影响,请使用 'same'。如果你有信号处理工具箱,如果你想尝试圆形移动平均线,你可以使用 cconv。类似的东西

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

        应该可以。

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

        【讨论】:

          【解决方案4】:

          我会用这个:

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

          【讨论】:

          • 谢谢,我想我现在明白了!
          猜你喜欢
          • 2021-05-30
          • 1970-01-01
          • 2014-12-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多