2012-12-03 115 views
1

我正在尋找實現一個滑動窗口使用我從大型數據集拉動的數據的指數加權移動平均值。指數加權平均C++嵌套for循環

該代碼的作品,但結果絕對不是他們應該是什麼,我似乎無法弄清楚爲什麼。這裏是我的代碼,並請給我良好的細節,什麼我究竟做錯了:

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

這是一些令人毛骨悚然的縮進。 – Borgleader

+0

@Borgleader不止一種縮進風格,只要一個是一致的,這裏真的沒有對錯。 SO上沒有任何宗教爭論的理由。 – Voo

+0

沒有,它沒有對齊,仍然是一個大括號錯位,我沒有設法糾正所有這些,因爲我剛纔注意到。 :) –

回答

2

基本問題是,TMP3和TMP4不會被初始化,所以TMP3 + =等等有未定義的結果。

我現在看你的代碼的方式,它應該是這個樣子:

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); 
} 

說明:有,如果在for循環中,作爲J的最後一個值將window-1反正不需要額外的, tmp3和tmp4將在每個i-循環開始時被初始化。 size()的類型是size_t而不是unsigned int(如果有的話)。

+0

謝謝我只是看不到發生了什麼問題。 –