1

GNU Octave で、for ループを使用せずにベクトルの n 日間の指数移動平均を計算したいと考えています。

for ループでこれを行うことはできますが、非効率的です。フィルター機能を使用したいのですが、これを正しく機能させる方法がわかりません。

4

2 に答える 2

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)場所または日数) を として使用していることに注意してください。必要に応じて調整します。nwindowalpha1/nalphaalpha

または、入力ベクトルと出力ベクトルの次元を一致させる必要がある場合があります。関数の最後の行としてNaN追加して、無効な値を埋めます。大まかな見積もりが必要な場合は、それを入力することもできます。meanV = [NaN(window-1,1); meanV];movingEMeansimpleAvg

于 2012-12-09T01:15:29.323 に答える