我在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 ++库找到中位数的工作示例将受到高度赞赏。
答案 0 :(得分:1)
简单地迭代:
for (auto d : arr)
acc(d);
或者使用算法:
for_each(begin(arr), end(arr), ref(acc));
注意:使用
std::ref(acc)
来避免传递值!
#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';
}
如果您坚持使用功能界面:
<强> 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