我试着用C++编写我自己的简单移动平均值
I tried coding my own simple moving average in C++
- 我想要一个有效的函数
- 我相信我的逻辑是正确的,因此我的(向量超出范围的错误(一定是由于不熟悉和正确使用代码造成的
- 我知道这个相当简单的算法有很长的代码。如果可以的话,请帮忙
基本上,我把长度作为"移动"窗口,因为它通过j循环到向量大小的末尾。这个矢量充满了股票价格。
如果数字1、2、3、4的2天移动平均线的长度等于2。我应该能够输出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
是2,closes.size()
是4,那么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语句。
相关文章:
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 将矩阵乘以我自己的输入的向量
- 如何正确包含我自己的标头?
- 如何使用我构建的库,而不会从源代码出错,但不为我自己的项目编译?
- 为什么__builtin_popcount比我自己的比特计数功能慢?
- 在C++中,我可以在定义自己的复制构造函数后跳过定义赋值运算符吗?
- 在wxWidgets的事件中包含我自己的数据的最佳方法是什么?
- 如何在我自己的staticLib中使用staticLib
- 在我自己的堆栈中实现top的问题
- 尝试检查输入的文本与我自己的自定义答案
- 我应该在服务模板中的什么位置添加自己的代码?
- 如何在我自己的类中重载"+"和"<<"运算符
- 我正在尝试在视觉工作室上创建自己的库/源函数
- C++:我自己类的动态数组
- 如何在 C++ 中使用我自己的类中的库?
- 如何链接我自己的 .so 文件而不是操作系统捆绑包 .so 文件?
- 如何构建默认使用我自己的构建libc ++的clang?
- 访问另一个类(系统)的非静态字段,就好像它是我自己的字段一样 - 优雅地
- 分发我自己的程序的几个问题
- 如何自己为我自己的shared_ptr实现实现别名构造函数