2016-07-21 4 views
2

J'utilise le code suivant pour calculer l'écart-type:C++ calcul de l'écart-type incorrect en utilisant std :: s'accumuler

std::vector<float> k = {4,6,2}; 
float mean = 4; 

float sum = std::accumulate(k.begin(), k.end(), 0, [&mean](float x, float y) { 
    return (y - mean) * (y - mean); 
}); 

float variance = sum/k.size(); 
float stdev = sqrt(variance); 

std::accumulate retours 4 quand il doit retourner:

(4-4)^2 + (6-4)^2 + (2-4)^2 = 8 

En outre, l'impression (y - mean) * (y - mean) donne :

0 
4 
4 

Alors, pourquoi ne renvoie-t-il pas 0 + 4 + 4?

Répondre

6

Vous n'utilisez pas le paramètre x. Effectuez les opérations suivantes:

float sum = std::accumulate(k.begin(), k.end(), 0.0F, [&mean](float x, float y) { 
    return x + (y - mean) * (y - mean); 
}); 

MISE À JOUR: valeur initiale comme flotteur

+1

Alors, voilà pourquoi il est revenu en fait que la dernière valeur. Merci beaucoup – DimChtz