我正在尝试对从.txt文件中获取一系列值的程序进行微调,并创建15个值的运行平均值。例如,它将读取前15个值,在第15个数字旁边输出该平均值,然后它将读取值2-16,取平均值并将其输出到第16个数字旁边。然后它将读取值3-17,取平均值并将其输出到第17个数字旁边,依此类推。不幸的是,我的程序没有取得太大进展,但这是我到目前为止的代码:
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdlib>
#include <iomanip>
using namespace std;
#define ARRAYSIZE 10000
#define OTHER 10000
int main(void)
{
//things needed
ifstream infile;
ofstream outfile;
double xArray[ARRAYSIZE];
double yArray[ARRAYSIZE];
double average;
double sum = 0;
double sum2=0;
double average2;
infile.open("data.txt");
if (infile.fail()) {
cout << "can't open data.txt\n";
exit(1);
}
for (int z = 0; z < 15; z++) {
infile >> xArray[ARRAYSIZE];
sum = xArray[ARRAYSIZE] + sum;
average = sum / (z+1);
}
outfile << xArray[ARRAYSIZE] << ", " << average << endl;
sum2 = sum;
//Running Average
for (int x = 0; x < 10000 && !infile.eof(); x++) {
infile >> yArray[OTHER];
sum2 = yArray[OTHER] + sum2;
average2 = sum2 / (x + 16);
cout << yArray[OTHER] << ", " << average2 << endl;
}
}
正如您所看到的,我可以获得所有内容的平均值,但我无法将平均值分成15个值段。
答案 0 :(得分:4)
我不想只是交给你工作代码。但为了让您不受困扰,请考虑以下方法:
i
,然后从那里向上计数。i % 15
的元素。这将从滚出窗口的滚动总和中删除元素。i % 15
。sum / 15.0
。 移动平均线的想法是仅对窗口中的元素求平均值。数组跟踪窗口。
使用上面的算法,总和跟踪窗口中元素的总和。在向窗口添加元素时,将它们添加到总和中。当您从窗口中删除元素时,将其从总和中删除。
然后,移动平均值只是除以窗口大小的总和。