1. ホーム
  2. c++

[解決済み] C++で標準偏差と分散を計算する

2022-03-06 01:43:39

質問

さて、何度か投稿していますが、以前は悩みがかなり漠然としていました。今週からC++を始めて、ちょっとしたプロジェクトをやっています。

私は標準偏差 & 分散を計算しようとしています。私のコードは100個の整数のファイルをロードして配列に入れ、それらをカウントして、平均、合計、分散、SDを計算します。しかし、分散については少し問題があります。

巨大な数字が表示されるのですが、これは計算に関係があるような気がしています。

平均値や合計値は大丈夫なのですが。

NBです。

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;
}

解決方法は?

蹄鉄の回答が示すように、分散を計算するためにループを使用する必要があります。

<ブロッククオート

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

は、配列から1つの要素を考慮するだけです。

horseshoeさんの提案したコードを改良しただけです。

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

ループを使わなくても、あなたの合計はうまくいきます。 アキュムレート 関数はすでにループを内包していますが、コード上では明らかにはなっていないので、同等の動作をする アキュムレート が何をやっているのかを明確に理解するために。

X ?= YX = X ? Y ここで ? は任意の演算子でよい。 また pow(Array[n] - mean, 2) を使うと、掛け算ではなく、二乗を取るので、より整然とした表現になります。