使用MATLAB,如何计算移动平均值?

3
使用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命令,但是出现了错误。这是我一直在尝试使用的conv命令,它作用于矩阵a的第二列:

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] 是用于移动平均的卷积核吗? - Oliver Charlesworth
是的,没错。我想这就是在调用 conv 函数时表示三日移动平均线的方法。 - enter_display_name_here
1
你所期望的输出并不像是移动平均。你是如何得到这些值的? - Phonon
对于矩阵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。因为计算3天移动平均值是从底部开始的,所以第4列的底部2行没有值。只有至少出现17、14和11时,“有效”输出才会显示。希望这样说得清楚? - enter_display_name_here
1个回答

4

一般情况下,如果您能展示错误信息会更有帮助。在这种情况下,您做了两件错误的事情:

首先,您的卷积需要除以三(或移动平均长度)。

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

太好了!非常感谢。这正是我想要的,这样我就不必使用循环了。 - enter_display_name_here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接