在GNU倍頻中,想要計算不使用for-loop的矢量的n日指數移動平均值。以八度爲單位執行向量化的指數移動平均值
我可以用for循環做到這一點,但效率不高。我想使用過濾器功能,但我不確定如何使其正常工作。
在GNU倍頻中,想要計算不使用for-loop的矢量的n日指數移動平均值。以八度爲單位執行向量化的指數移動平均值
我可以用for循環做到這一點,但效率不高。我想使用過濾器功能,但我不確定如何使其正常工作。
位從這個線程
http://octave.1599824.n4.nabble.com/vectorized-moving-average-td2132090.html
拼湊後,我建立八度的過濾功能,此功能。
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
。
或者,我有時需要輸入和輸出矢量的尺寸才能匹配。我通過將meanV = [NaN(window-1,1); meanV];
添加爲movingEMean
函數的最後一行來填充無效值NaN
。如果您需要粗略估算,也可以用simpleAvg
填充。