GNU Octave で、for ループを使用せずにベクトルの n 日間の指数移動平均を計算したいと考えています。
for ループでこれを行うことはできますが、非効率的です。フィルター機能を使用したいのですが、これを正しく機能させる方法がわかりません。
GNU Octave で、for ループを使用せずにベクトルの n 日間の指数移動平均を計算したいと考えています。
for ループでこれを行うことはできますが、非効率的です。フィルター機能を使用したいのですが、これを正しく機能させる方法がわかりません。
このスレッドのビットをつなぎ合わせた後
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