计算C++中的标准差和方差

Jac*_*ck 8 c++ arrays average variance standard-deviation

所以我发布了几次,以前我的问题很模糊

我本周开始使用C++,并且做了一个小项目

所以我试图计算标准偏差和方差

我的代码加载一个100个整数的文件,并将它们放入一个数组,计算它们,计算平均值,总和,var和sd

但我的方差有点麻烦

我不断得到一个巨大的数字 - 我感觉它与它的计算有关

我的意思和总和还可以

任何帮助或提示?

注意:

sd&mean calcs

干杯,

插口

 using namespace std;
    int main()

{

int n = 0;
int Array[100];
float mean;
float var;
float sd;
string line;
float numPoints;

ifstream myfile(“numbers.txt");

if (myfile.is_open())

{
    while (!myfile.eof())

    {
        getline(myfile, line);

        stringstream convert(line);

        if (!(convert >> Array[n]))

        {
            Array[n] = 0;
        }
        cout << Array[n] << endl;

        n++;

    }

    myfile.close();

    numPoints = n;

}
else cout<< "Error loading file" <<endl;

int sum = accumulate(begin(Array), end(Array), 0, plus<int>());

cout << "The sum of all integers: " << sum << endl;

mean = sum/numPoints;

cout << "The mean of all integers: " << mean <<endl;

var = ((Array[n] - mean) * (Array[n] - mean)) / numPoints;

sd = sqrt(var);

cout << "The standard deviation is: " << sd <<endl;

return 0;

}
Run Code Online (Sandbox Code Playgroud)

Ahm*_*tar 13

正如马蹄铁的另一个答案正确建议的那样,你将不得不使用一个循环来计算方差,否则就是陈述

var =((Array [n] - mean)*(Array [n] - mean))/ numPoints;

将只考虑数组中的单个元素.

刚刚改进马蹄铁的建议代码:

var = 0;
for( n = 0; n < numPoints; n++ )
{
  var += (Array[n] - mean) * (Array[n] - mean);
}
var /= numPoints;
sd = sqrt(var);
Run Code Online (Sandbox Code Playgroud)

即使不使用循环,你的总和也能正常工作,因为你正在使用累积函数,它已经在其中有一个循环,但是在代码中不明显,看看累积的等效行为,以便清楚地了解它正在做什么.

注意: 任何操作员的位置X ?= Y都很短.你也可以用它来取代正方形,而不是自己乘以它使它更整洁.X = X ? Y?pow(Array[n] - mean, 2)

  • @jack技术上****和****循环(语法除外)之间没有区别,但通常在需要时:(1)在开始循环之前初始化变量,(2)增量在循环结束时的变量中然后(3)想要检查重复的条件; 然后**for**使代码更具可读性,并确保您不会忘记三者中的任何一个. (2认同)

ray*_*ica 9

这是使用std::accumulate但不使用pow. 另外,我们可以使用匿名函数来定义我们计算均值后如何计算方差。请注意,这会计算无偏样本方差。

#include <vector>
#include <algorithm>
#include <numeric>

template<typename T>
T variance(const std::vector<T> &vec) {
    const size_t sz = vec.size();
    if (sz == 1) {
        return 0.0;
    }

    // Calculate the mean
    const T mean = std::accumulate(vec.begin(), vec.end(), 0.0) / sz;

    // Now calculate the variance
    auto variance_func = [&mean, &sz](T accumulator, const T& val) {
        return accumulator + ((val - mean)*(val - mean) / (sz - 1));
    };

    return std::accumulate(vec.begin(), vec.end(), 0.0, variance_func);
}
Run Code Online (Sandbox Code Playgroud)

如何使用此功能的示例:

#include <iostream>
int main() {
    const std::vector<double> vec = {1.0, 5.0, 6.0, 3.0, 4.5};
    std::cout << variance(vec) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)