O'Reilly logo

C++ Cookbook by Jeff Cogswell, Jonathan Turkanis, Christopher Diggins, D. Ryan Stephens

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

11.5. Computing Variance, Standard Deviation, and Other Statistical Functions

Problem

You want to compute one or more of the common statistics such as variance, standard deviation, skew, and kurtosis of a sequence of numbers.

Solution

You can use the accumulate function from the <numeric> header to compute many meaningful statistical functions beyond simply the sum by passing custom function objects. Example 11-9 shows how to compute several important statistical functions, using accumulate.

Example 11-9. Statistical functions

#include <numeric> #include <cmath> #include <algorithm> #include <functional> #include <vector> #include <iostream> using namespace std; template<int N, class T> T nthPower(T x) { T ret = x; for (int i=1; i < N; ++i) { ret *= x; } return ret; } template<class T, int N> struct SumDiffNthPower { SumDiffNthPower(T x) : mean_(x) { }; T operator()(T sum, T current) { return sum + nthPower<N>(current - mean_); } T mean_; }; template<class T, int N, class Iter_T> T nthMoment(Iter_T first, Iter_T last, T mean) { size_t cnt = distance(first, last); return accumulate(first, last, T(), SumDiffNthPower<T, N>(mean)) / cnt; } template<class T, class Iter_T> T computeVariance(Iter_T first, Iter_T last, T mean) { return nthMoment<T, 2>(first, last, mean); } template<class T, class Iter_T> T computeStdDev(Iter_T first, Iter_T last, T mean) { return sqrt(computeVariance(first, last, mean)); } template<class T, class Iter_T> T computeSkew(Iter_T begin, Iter_T end, T mean) ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required