2012-12-09 21 views

回答

1

位從這個線程

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)(其中nwindow或天數)爲alpha,但我用1/n因爲alpha該值符合我的需求。根據需要調整alpha

或者,我有時需要輸入和輸出矢量的尺寸才能匹配。我通過將meanV = [NaN(window-1,1); meanV];添加爲movingEMean函數的最後一行來填充無效值NaN。如果您需要粗略估算,也可以用simpleAvg填充。