boost/accumulators

C/C++で、平均値、最大値、最小値、分散、中央値等の統計量を計算するなら、boost::accumulators が便利。

2017年6月13日追記.情報が古かったので更新しました

#include <iostream>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>

using namespace boost::accumulators;

int main()
{
    accumulator_set<double, 
                    stats<tag::mean, tag::min, tag::max, tag::variance> > acc;

    acc(1.2);
    acc(2.3);
    acc(3.4);
    acc(4.5);

    std::cout << "mean:   " << mean(acc) << std::endl;
    std::cout << "min:    " << min(acc) << std::endl;
    std::cout << "max:    " << max(acc) << std::endl;
    std::cout << "var:    " << variance(acc) << std::endl;

    return 0;
}

すでにデータが配列に格納されているなら、こんな感じ。

#include <iostream>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>


using namespace boost::accumulators;

int main()
{
     accumulator_set<double, stats<tag::mean, tag::min, tag::max> > acc;
     
     double data[]={1.2, 2.3, 3.4, 4.5};
     for ( auto x : data ) {
          acc(x);
     }
     
     std::cout << "Mean:   " << mean(acc) << std::endl;
     std::cout << "min:    " << min(acc) << std::endl;
     std::cout << "max:    " << max(acc) << std::endl;
     
     return 0;
}

stats の部分は MPL で実装されていて、実にboost的。