【问题标题】:Using MATLAB, how can I find the moving average?使用 MATLAB,我怎样才能找到移动平均线?
【发布时间】:2013-06-12 00:34:20
【问题描述】:

使用 MATLAB,如何找到矩阵特定列的 3 天移动平均线并将移动平均线附加到该矩阵?我正在尝试计算矩阵底部到顶部的 3 天移动平均线。我已经提供了我的代码:

给定以下矩阵 a 和掩码:

a = [1,2,3;4,5,6;7,8,9;10,11,12;13,14,15;16,17,18];
mask = ones(3,1);

我已尝试实施 conv 命令,但收到错误消息。这是我一直试图在矩阵 a 的第二列使用的 conv 命令:

a(:,4) = conv(a(:,2),mask,'valid');

我想要的输出在以下矩阵中给出:

desiredOutput = [1,2,3,5;4,5,6,8;7,8,9,11;10,11,12,14;13,14,15,0;16,17,18,0;]

如果您有任何建议,我将不胜感激。谢谢!

【问题讨论】:

  • [1 1 1] 是移动平均的卷积核吗?
  • 是的,没错。我认为这是在调用 conv 时表示 3 天移动平均线的方式。
  • 您想要的输出看起来不像移动平均线。您是如何获得这些值的?
  • 对于矩阵 a 的第 2 列,我按如下方式计算 3 天移动平均线,并将结果放在矩阵 a 的第 4 列中(我将矩阵 a 重命名为“desiredOutput”只是为了说明)。 17、14、11的3天平均值为14; 14、11、8的3天平均值为11; 11、8、5的3天平均值为8; 8、5、2 的 3 天平均值为 5。第 4 列的底部 2 行没有值,因为 3 天移动平均线的计算从底部开始。 “有效”输出至少要到 17、14 和 11 点才会显示。希望这有意义吗?

标签: matlab matrix append convolution moving-average


【解决方案1】:

一般来说,如果您显示错误会有所帮助。在这种情况下,您做错了两件事:

首先你的卷积需要除以三(或移动平均线的长度)

c = conv(a(:,2),mask,'valid')/3

c =

     5
     8
    11
    14

其次,注意c 的大小。你不能只将c 放入a。获得移动平均线的典型方法是使用same

a(:,4) = conv(a(:,2),mask,'same')/3

a =

    1.0000    2.0000    3.0000    2.3333
    4.0000    5.0000    6.0000    5.0000
    7.0000    8.0000    9.0000    8.0000
   10.0000   11.0000   12.0000   11.0000
   13.0000   14.0000   15.0000   14.0000
   16.0000   17.0000   18.0000   10.3333

但这看起来不像你想要的。

相反,您不得不使用几行代码:

c = conv(a(:,2),mask,'valid')/3;
a(1:length(c),4) = c

a =

     1     2     3     5
     4     5     6     8
     7     8     9    11
    10    11    12    14
    13    14    15     0
    16    17    18     0

【讨论】:

  • 完美!非常感谢你。这正是我一直在寻找的,这样我就不必使用循环了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多