以八度为单位执行向量化指数移动平均

时间:2012-12-09 00:24:35

标签: octave time-series vectorization moving-average

在GNU Octave中,想要在不使用for循环的情况下计算向量的n天指数移动平均值。

我能够通过for循环执行此操作,但效率很低。我想使用过滤功能,但我不确定如何使其正常工作。

1 个答案:

答案 0 :(得分:1)

将此线程中的位拼凑起来

http://octave.1599824.n4.nabble.com/vectorized-moving-average-td2132090.html

我使用Octave的过滤功能构建了这个功能。

function meanV = movingEMean(V, window)
  simpleAvg = mean(V(1:window));
  alpha = 1/window;
  X = V(window:end);
  X(1) = simpleAvg;
  meanV = filter(alpha, [1 alpha-1], X, simpleAvg*(1-alpha));
end

首先以简单移动平均线为基础。 V是用于计算指数移动平均值的数字的列向量。 window是整数天数。我用了12。

以下是此功能的数学解释。

http://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average

请注意,该网页使用2/(n+1)(其中nwindow或天数)为alpha,但我使用1/n因为该值alpha符合我的需要。根据需要调整alpha

或者,我有时需要输入和输出矢量的尺寸来匹配。我通过添加NaN作为meanV = [NaN(window-1,1); meanV];函数的最后一行,使用movingEMean填充无效值。如果您需要粗略估算,也可以使用simpleAvg填充它。