我正在寻找使用我从大型数据集中提取的数据的滑动窗口来实现指数加权移动平均值。
代码有效但结果肯定不是它们应该是什么,我似乎无法弄清楚原因。这是我的代码,请详细说明我做错了什么:
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;
}
}
答案 0 :(得分: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 );
}
说明:如果在for循环中不需要额外的,因为无论如何j的最后一个值将是window-1
,tmp3和tmp4将在每个i循环开始时被初始化。 size()的类型是size_t
而不是unsigned int,如果有的话。