読者です 読者をやめる 読者になる 読者になる

Boost.Accumulators std::vectorを要素にする

C++

BOOST_NUMERIC_FUNCTIONAL_STD_VECTOR_SUPPORTをdefineしておくと、std::vector用の演算子が定義され、accumulators_setの要素にstd::vectorを指定することができるようになります。

#define BOOST_NUMERIC_FUNCTIONAL_STD_VECTOR_SUPPORT

#include <iostream>
#include <vector>
#include <boost/assign/list_of.hpp>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics.hpp>
#include <boost/range/algorithm/for_each.hpp>

void disp(double x) { std::cout << x << ' '; }

int main()
{
    using namespace boost::accumulators;

    accumulator_set<std::vector<double>, stats<tag::min, tag::mean, tag::sum> >
        acc(std::vector<double>(2)); // vectorの要素数

    const std::vector<double> v1 = boost::assign::list_of(1.0)(2.0);
    const std::vector<double> v2 = boost::assign::list_of(2.0)(3.0);
    const std::vector<double> v3 = boost::assign::list_of(3.0)(4.0);

    acc(v1);
    acc(v2);
    acc(v3);

    const std::vector<double>& min_vec  = extract::min(acc);    // 最小値
    const std::vector<double>& mean_vec = extract::mean(acc);   // 平均値
    const std::vector<double>& sum_vec  = extract::sum(acc);    // 合計値

    boost::for_each(min_vec,  disp); std::cout << std::endl;
    boost::for_each(mean_vec, disp); std::cout << std::endl;
    boost::for_each(sum_vec,  disp); std::cout << std::endl;
}
1 2
2 3
6 9

std::vectorのほかに、std::complexとstd::valarrayも対応されています。
それぞれ、BOOST_NUMERIC_FUNCTIONAL_STD_COMPLEX_SUPPORT、BOOST_NUMERIC_FUNCTIONAL_STD_VALARRAY_SUPPORTをdefineすることで利用可能になります。