2013-06-12 37 views
3

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

考虑下面的矩阵和掩码:

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的第2列使用:

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;] 

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

+0

是'[111]'的卷积移动平均内核? –

+0

是的,这是正确的。我认为这是在调用conv时代表3日移动平均线的方式。 – Aaron

+1

您所需的输出看起来不像移动平均值。你如何获得这些价值? – Phonon

回答

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 
+0

完美!非常感谢你。这正是我所寻找的,所以我不必使用循环。 – Aaron