On a souvent besoin de calculer quelques statistiques sur un ensemble de données. Si calculer la moyenne en une passe est trivial, le calcul de l’écart type demande un peu d’attention. Ci-dessous, une solution que je poste comme pense-bête.
Le snippet calcule aussi les valeurs min et max.
Code snippet :
std::vector<int> vec; // Container with values
uint64_t count = 0 ;
uint64_t accu = 0 ;
uint64_t accu2 = 0 ;
uint64_t min = -1;
uint64_t max = 0 ;
for_each(begin(vec), end(vec) [&](int x)
{
accu += x;
accu2 += x * x;
min = (std::min)(min, x);
max = (std::max)(max, x);
++count;
});
float average = accu/float(count);
float stdev = sqrt(accu2*count - accu*accu)/count;
Écart type en une passe
Site sur le bricolage, la bidouille et l'informatique