1

大規模なデータセットから取得したデータを使用して、スライディングウィンドウで指数関数的に重み付けされた移動平均を実装しようとしています。

コードは機能しますが、結果は間違いなく本来あるべきものではなく、その理由を理解できないようです。これが私のコードです。私が間違っていることについて詳しく教えてください。

for(unsigned int i = window; i< close_price.size(); i++)
{
     double tmp3;
     double tmp4;
     for(int j = 0; j < window; j++) 
     {
          tmp3 += pow(lambda,j) * pow(close_price[i-j], 2);
          tmp4 += pow(close_price[i-j], 2); 
          if(j == window-1)
          {
              double temp = (1-lambda) * (pow(close_price[window], 2) + tmp3);
              ewma.push_back( sqrt(temp) );
              sma.push_back( tmp4/window );
          }
          tmp3 = 0;
          tmp4 = 0;
    }
}
4

1 に答える 1

2

基本的に問題は、tmp3 と tmp4 が初期化されていないため、tmp3+=blah の結果が未定義であることです。

あなたのコードを見ると、次のようになります。

for(size_t i = window; i< close_price.size(); i++)
{
     double tmp3 = 0.0;
     double tmp4 = 0.0;
     for(size_t j = 0; j < window; j++) 
     {
          tmp3 += pow(lambda,j) * pow(close_price[i-j], 2);
          tmp4 += pow(close_price[i-j], 2); 
     }
     double temp = (1-lambda) * (pow(close_price[window], 2) + tmp3);
     ewma.push_back( sqrt(temp) );
     sma.push_back( tmp4/window );
}

window-1説明: j の最後の値はいずれにせよ、tmp3 と tmp4 は i ループの開始ごとに初期化されるため、for ループ内では追加の if は必要ありません。size() の型はsize_tunsigned int ではありません。

于 2012-12-03T03:12:27.957 に答える