экспоненциально взвешенное среднее c ++, вложенное в циклы

Я рассчитываю реализовать экспоненциально взвешенное скользящее среднее с помощью скользящего окна, используя данные, которые я извлекаю из большого набора данных.

Код работает, но результаты определенно не такие, какими они должны быть, и я не могу понять, почему. Вот мой код и, пожалуйста, дайте мне подробную информацию о том, что я делаю неправильно:

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

1

Решение

В основном проблема в том, что 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_t не беззнаковый int, если есть.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]