Jac*_*ck 8 c++ arrays average variance standard-deviation
所以我发布了几次,以前我的问题很模糊
我本周开始使用C++,并且做了一个小项目
所以我试图计算标准偏差和方差
我的代码加载一个100个整数的文件,并将它们放入一个数组,计算它们,计算平均值,总和,var和sd
但我的方差有点麻烦
我不断得到一个巨大的数字 - 我感觉它与它的计算有关
我的意思和总和还可以
任何帮助或提示?
注意:
干杯,
插口
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)
这是使用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)