使用boost :: accumulators :: statistics来查找数组的中位数

时间:2018-03-12 17:17:53

标签: c++ arrays boost

我在MATLAB中计算了一个大尺寸的一维数组。我需要找到这个数组的中位数。我想为此目的使用boost c ++库,因为它具有使用P-square算法计算中值的实现,该算法可以有效地用于大型数组。下面是逐个推送5个数字并使用boost库查找中位数的代码。我想更改此代码,以便我可以将数组作为参数传递并找到该数组的中位数。数组的大小很大,所以我不能使用'for loop'来推送累加器集中的每个元素。

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

using namespace boost::accumulators;

int main() {   
 accumulator_set<double, features<tag::mean, tag::median> > acc;  

 acc(8);   
 acc(9);   
 acc(10);   
 acc(11);   
 acc(12);   
 //double arr[3] = {1,2,3};   
 //acc(arr);   
 std::cout << mean(acc) << '\n';   
 std::cout << median(acc) << '\n'; 
}

我确实找到了一些资源要求使用向量,但我不明白。将一个小数组作为参数传递,然后使用boost c ++库找到中位数的工作示例将受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

简单地迭代:

for (auto d : arr)
    acc(d);

或者使用算法:

for_each(begin(arr), end(arr), ref(acc));
  

注意:使用std::ref(acc)来避免传递值!

演示

Live On Coliru

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

using namespace boost::accumulators;

int main() {
    accumulator_set<double, features<tag::mean, tag::median> > acc;

    double arr[3] = { 1, 2, 3 };

    for (auto d : arr)
        acc(d);

    using namespace std;
    for_each(begin(arr), end(arr), ref(acc));

    std::cout << mean(acc) << '\n';
    std::cout << median(acc) << '\n';
}

PS:

如果您坚持使用功能界面:

<强> Live On Coliru

template <typename Accum, typename Range>
void do_sample(Accum& accum, Range const& range) {
    using namespace std;
    for_each(begin(range), end(range), std::ref(accum));
}

(适用于矢量或任何其他范围)。打印:

2
3