从导入的二维数组计算平均值

Posted

技术标签:

【中文标题】从导入的二维数组计算平均值【英文标题】:Calculating average from imported 2D array 【发布时间】:2015-12-07 22:34:19 【问题描述】:

之前我问过如何以随机数作为数据导出二维数组。

链接:Converting 2D array to text using c++ functions

现在我正在尝试编写一个单独的程序来计算该数组每一列的平均值。

但现在我遇到了“未初始化变量”的问题,我很确定这些变量已初始化。

不太确定从这里做什么。任何帮助将不胜感激!

#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main ()

    string Data, FileName;
int row, col, x, y;
float Matrix[50][50], sum, average;

cout << "Enter the name you gave the matrix file.\n";
cout << "(DO NOT INCLUDE ANY SPACES OR EXTENSIONS!)\n";
cin >> FileName;
FileName = "C:\\Users\\Public\\Documents\\" + FileName + ".ascii";

ifstream Fin(FileName);
if (Fin.is_open())

    row=0;
    while(!Fin.eof())
    
        getline(Fin, Data);
        stringstream ss(Data);
        col=0;
        while(ss >> Matrix[row][col])
        
            col++;
        
        row++;
     
    Fin.close();

else 
    cout << "Unable to open file"; 

for (int y = 0; y < col; y++)

    for (int x = 0; x < row; x++)
    
        sum = sum + Matrix[x][y];
    

    average = sum / row;
    cout << average << " for column " << col << "\n";


system("pause"); 
return 0;

更新: 解决了“未初始化的变量”错误。

但是当我尝试计算平均值时,现在得到“-nan(ind)”。

这是新代码...

#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main ()

string Data, FileName;
int row, col;
float Matrix[50][50], sum, average;
sum = 0;

cout << "Enter the name you gave the matrix file.\n";
cout << "(DO NOT INCLUDE ANY SPACES OR EXTENSIONS!)\n";
cin >> FileName;
FileName = "C:\\Users\\Public\\Documents\\" + FileName + ".ascii";

ifstream Fin(FileName);
if (Fin.is_open())

    row=0;
    while(!Fin.eof())
    
        getline(Fin, Data);
        stringstream ss(Data);
        col=0;
        while(ss >> Matrix[row][col])
        
            col++;
        
        row++;
     
    Fin.close();

else 
    cout << "Unable to open file"; 

for (int y = 0; y < row; y++)

    for (int x = 0; x < col; x++)
    
        sum = sum + Matrix[x][y];
    

    average = sum / col;
    cout << average << "\n";




system("pause"); 
return 0;

更新 2: 我似乎只能得到第一列的平均值。无法真正弄清楚如何重复此步骤。我尝试过使用 do 和 for 循环,但这给我带来了一堆错误并且失去了我得到的唯一平均值。

如果有人想看看,请注意它非常混乱......

#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int main ()

string Data, FileName;
int row, col;
float Matrix[50][50], sum, average;
sum = 0;

cout << "Enter the name you gave the matrix file.\n";
cout << "(DO NOT INCLUDE ANY SPACES OR EXTENSIONS!)\n";
cin >> FileName;
FileName = "C:\\Users\\Public\\Documents\\" + FileName + ".ascii";

ifstream Fin(FileName);
if (Fin.is_open())

    row=0;
    while(!Fin.eof())
    
        getline(Fin, Data);
        stringstream ss(Data);
        col=0;
        while(ss >> Matrix[row][col])
        
            col++;
        
        row++;
     
    Fin.close();

else 
    cout << "Unable to open file"; 

double AvgArray[50];

for (int y = 0; y < 50; y++)

    for (int x = 1; x < 50; x++)
    
        if (Matrix[x][y]<0)
        
            break;
        
        sum = sum + Matrix[x][y];
        average = sum / x;

    
    if (Matrix[y][y]<0)
    
        break;
    
    average = AvgArray[y];



cout << average << "\n";

system("pause"); 
return 0;

【问题讨论】:

-nan(ind) 通常是浮点数除以零的结果。 while(!Fin.eof()) 几乎总是错误的:***.com/questions/5605125/… 【参考方案1】:

您忘记在第二个 for 循环之前将 sum 设置为 0。在 UPDATE 2 中,您仍然没有将 sum 设置为 0!?

在第一个“for”之后和第二个之前...在开始添加列的总和之前...

喜欢这个

for (int y = 0; y < col; y++)

    sum = 0;
    for (int x = 0; x < row; x++)
    
        sum = sum + Matrix[x][y];
    

    average = sum / row;
    cout << average << " for column " << y << "\n";

【讨论】:

谢谢。才发现的。但它仍然不会计算列的平均值。试图看看我还做错了什么。【参考方案2】:

你给了这个:

for (int y = 0; y < 50; y++)

    for (int x = 1; x < 50; x++)
    
           if (Matrix[x][y]<0)
        
            break;
        
        sum = sum + Matrix[x][y];
        average = sum / x;
    
    if (Matrix[y][y]<0)
    
        break;
    
    average = AvgArray[y];


在这部分代码中,您似乎正在尝试计算每一列中每一行的平均值(因为您将 average = sum / x; 放在两个 for 循环中。)我建议计算总和整个列之前计算平均值,以节省代码/时间。此外,您还输入了average = AvgArray[y];。假设您尝试用每列的平均值填充此数组,则您需要将 average to AvgArray[y] 分配。目前,您从不为 AvgArray[] 分配任何值。

cout &lt;&lt; average &lt;&lt; "\n";

就像 Zsolt Marx 给出的代码一样,您需要将此行放在两个 for 循环中较大的一个中。否则,如果您保持原样,代码将仅显示计算的最后一列的平均值。

【讨论】:

以上是关于从导入的二维数组计算平均值的主要内容,如果未能解决你的问题,请参考以下文章

二维数组的 Numpy 元素平均计算

回溯法计算二维数组最短路径

数组(随机生成一维数组),二维数组的概念和题目设计(利用二维数组 :任意给定分数去计算科目和人均平均分)

合并二维数组,并计算重复字段的平均值

仅当满足每行元素的条件时,才计算二维数组特定列的均值和方差

如何有效地计算 numpy 二维数组的块均值(不规则块)?