所以,我已经贴过几次了,以前我的问题都很模糊。我这周开始学习C++,一直在做一个小项目。
我正在尝试计算标准差和方差。我的代码加载了一个100个整数的文件,并将它们放入一个数组中,对它们进行计数,计算平均值、总和、方差和SD。但我在方差方面遇到了一点麻烦。
我不断得到一个巨大的数字--我有一种感觉,这与它的计算有关。
我的平均数和总和都可以。
注:
using namespace std;
int main() {
int n = 0;
int Array[100];
float mean;
float var, 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;
}
8条答案
按热度按时间zkure5ic1#
您可以创建一个function object传递给
std::accumulate
来计算平均值,而不是写出更多的循环。当我们这样做的时候,我们可以使用std::istream_iterator来加载文件,而std::vector是因为我们不知道在编译时有多少个值。
gupuwyp22#
yqlxgs2m3#
如果有一个包含F(x)值的表
使用Map的基本方法。
Map的第一个条目保存值,第二个条目保存问题的f(x)(概率)值。
注意:不要犹豫我的类名,你可以直接在你的程序中使用它。
查找平均值
用此图求平均值并返回。
计算方差和标准偏差
计算这些值并打印出来。(如果你愿意,你也可以返回)
注意,取一个有均值的值。如果需要,也可以在此函数中调用
meanFinder()
函数。基本用法
cin
的基本用法请注意,我在调用
varianceFinder()
时调用了meanFinder()
。InputOutput
3duebb1j4#
假设数据点在
std::vector<double> data
中,可能有一个比公认答案稍微更有效和可读的代码:wh6knrhe5#
这里有另一种方法,使用
std::accumulate
,但不使用pow
。此外,我们可以使用匿名函数定义如何在计算均值之后计算方差。注意,这将计算无偏样本方差。如何使用此函数的示例:
frebpwbc6#
正如horseshoe的另一个答案所正确建议的那样,您必须使用循环来计算方差,否则语句
变量=((数组[n] -平均值)*(数组[n] -平均值))/点数;
将只考虑数组中的单个元素。
刚刚改进了horseshoe的建议代码:
即使不使用循环,您的求和也能正常工作,因为您使用的是accumulate函数,该函数内部已经有一个循环,但在代码中并不明显,请查看accumulate的等效行为,以清楚地了解它在做什么。
注意:
X ?= Y
是X = X ? Y
的缩写,其中?
可以是任何运算符。此外,您可以使用pow(Array[n] - mean, 2)
来计算平方,而不是将其乘以自身,使其更整洁。3qpi33ja7#
C++中计算标准差和方差的两种简单方法。
1tu0hz3e8#
您的方差计算在循环之外,因此它仅基于
n== 100
值。您需要一个额外的循环。您需要: