По сути, я принимаю длину как «движущееся» окно, поскольку оно проходит через j до конца размера вектора. Этот вектор заполнен ценами на акции.
Если длина равна 2 для 2-дневного скользящего среднего для чисел 1 2 3 4. Я должен быть в состоянии вывести 1,5, 2,5 и 3,5. Тем не менее, я получаю ошибку вне диапазона.
Логика показана в коде. Если бы эксперт мог помочь мне с этой простой функцией скользящего среднего, которую я пытаюсь создать, это было бы здорово! Благодарю.
void Analysis::SMA()
{
double length;
cout << "Enter number days for your Simple Moving Average:" << endl;
cin >> length;
double sum = 0;
double a;
while (length >= 2){
vector<double>::iterator it;
for (int j = 0; j < close.size(); j++){
sum = vector1[length + j - 1] + vector1[length + j - 2];
a = sum / length;
vector2.push_back(a);
vector<double>::iterator g;
for (g = vector2.begin(); g != vector2.end(); ++g){
cout << "Your SMA: " << *g;
}
}
}
}
Вам не нужно 3 цикла для вычисления скользящего среднего по массиву данных, вам нужно только 1. Вы перебираете массив и отслеживаете сумму последних n элементов, а затем просто настраиваете ее для каждого нового значения, добавление одного значения и удаление одного каждый раз.
Например, предположим, у вас есть набор данных:
4 8 1 6 9
и вы хотите вычислить скользящее среднее с размером окна 3, а затем вы получите промежуточную сумму следующим образом:
iteration add subtract running-total output average
0 4 - 4 - (not enough values yet)
1 8 - 12 -
2 1 - 13 13 / 3
3 6 4 15 15 / 3
4 9 8 16 16 / 3
Обратите внимание, что мы добавляем каждый раз, мы начинаем вычитать на итерации 3 (для размера окна 3) и начинаем выводить среднее значение на итерации 2 (размер окна минус 1).
Так что код будет примерно таким:
double runningTotal = 0.0;
int windowSize = 3;
for(int i = 0; i < length; i++)
{
runningTotal += array[i]; // add
if(i >= windowSize)
runningTotal -= array[i - windowSize]; // subtract
if(i >= (windowSize - 1)) // output moving average
cout << "Your SMA: " << runningTotal / (double)windowSize;
}
Вы можете адаптировать это, чтобы использовать вашу векторную структуру данных.
Внутри вашей внешней цикла while вы никогда не меняетесь length
так что ваша функция будет работать вечно.
Затем обратите внимание, что если length
это два и closes.size()
это четыре, length + j - 1
будет 5, так что мои навыки психической отладки скажи мне свое vector1
слишком короток, и вы индексируете с конца.
На этот вопрос ответили, но я решил опубликовать полный код для людей, которые ищут информацию в будущем.
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<double> vector1 { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
double length;
cout << "Enter number days for your Simple Moving Average:" << endl;
cin >> length;
double sum = 0;
int cnt = 0;
for (int i = 0; i < vector1.size(); i++) {
sum += vector1[i];
cnt++;
if (cnt >= length) {
cout << "Your SMA: " << (sum / (double) length) << endl;
sum -= vector1[cnt - length];
}
}
return 0;
}
Это немного отличается от ответа. Введена переменная ‘cnt’, чтобы избежать дополнительного оператора if.