如何从.txt文件创建一个运行平均值为15的值

How can I create a running average of 15 values from .txt file?

本文关键字:运行 一个 平均值 的值 txt 文件创建      更新时间:2023-10-16

我正在尝试微调一个程序,该程序从.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.txtn";
        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个值段。

我不想只把工作代码交给您。但要想让你摆脱困境,请考虑以下方法:

  1. 声明一个正好包含15个元素的数组
  2. 将总和初始化为0
  3. 在所有传入元素上循环,执行以下操作:
    1. 为第一个元素保留一个从0开始并从0开始向上计数的索引值i
    2. 如果您看到多于15个元素,请从总和中减去数组位置i % 15处的元素。这将从滚动和中删除滑出窗口的元素
    3. 从文件中读取一个新元素
    4. 将新元素添加到总和中。这会在元素滑入窗口时将其添加到滚动和中
    5. 将新元素存储在数组位置i % 15
    6. 如果您看到了15个或更多元素,请将移动平均值输出为sum / 15.0

移动平均的概念是只对窗口中的元素进行平均。数组跟踪窗口。

使用上面的算法,总和跟踪窗口中元素的总和。当您将元素添加到窗口时,您将它们添加到总和中。当您从窗口中删除元素时,您就从总和中删除了它们。

那么,移动平均值就是总和除以窗口的大小。