алгоритм — я пытался кодировать свою собственную простую скользящую среднюю в переполнении стека

  1. Я хочу функцию, которая работает.
  2. Я считаю, что моя логика верна, поэтому моя (ошибка вектора вне диапазона) должна исходить из-за отсутствия знакомства и правильного использования кода.
  3. Я знаю, что для этого довольно простого алгоритма существует длинный код.
    Пожалуйста, помоги, если можешь.

По сути, я принимаю длину как «движущееся» окно, поскольку оно проходит через 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;
}
}
}
}

0

Решение

Вам не нужно 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;
}

Вы можете адаптировать это, чтобы использовать вашу векторную структуру данных.

3

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

Внутри вашей внешней цикла while вы никогда не меняетесь length так что ваша функция будет работать вечно.

Затем обратите внимание, что если length это два и closes.size() это четыре, length + j - 1 будет 5, так что мои навыки психической отладки скажи мне свое vector1 слишком короток, и вы индексируете с конца.

1

На этот вопрос ответили, но я решил опубликовать полный код для людей, которые ищут информацию в будущем.

#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.

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