在GNU Octave中,想要在不使用for循环的情况下计算向量的n天指数移动平均值。
我能够通过for循环执行此操作,但效率很低。我想使用过滤功能,但我不确定如何使其正常工作。
答案 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)
(其中n
为window
或天数)为alpha
,但我使用1/n
因为该值alpha
符合我的需要。根据需要调整alpha
。
或者,我有时需要输入和输出矢量的尺寸来匹配。我通过添加NaN
作为meanV = [NaN(window-1,1); meanV];
函数的最后一行,使用movingEMean
填充无效值。如果您需要粗略估算,也可以使用simpleAvg
填充它。