【问题标题】:How can I create a running average of 15 values from .txt file?如何从 .t​​xt 文件创建 15 个值的运行平均值?
【发布时间】:2013-12-09 00:52:33
【问题描述】:

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

【问题讨论】:

  • 您的索引 xArray[ARRAYSIZE]yArray[OTHER] 不正确。他们访问数组末尾的一个元素。实际上,您编写代码的方式根本不需要数组,因此您可能会重新考虑自己在做什么。如果您确实需要滑动窗口平均值,则需要对最后 15 个样本进行处理,但您只查看最近的样本。
  • @JoeZ 你能给我一个代码示例来说明你的意思吗?没有数组你会怎么做?
  • @HansPassant 切换 for 循环到底是什么意思?
  • 我并不是说你可以在没有数组的情况下做到这一点。我是说您的代码没有使用它声明的数组,因为它总是在读取和写入相同的元素。这表明你做错了什么。

标签: c++ arrays average file-io


【解决方案1】:

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

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

移动平均的想法是仅对窗口中的元素进行平均。该数组跟踪窗口。

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

因此,移动平均线就是总和除以窗口大小。

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 2012-06-03
    • 2021-12-27
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多