我想获得未排序的可变长度特征 c++ vectorXf 对象的 weighted_median。看来我可以使用 boost 的统计累加器库中的 boost weighted_median 函数来有效地做到这一点[?]。
从本质上讲,我正在尝试做一些与 这里所做的非常相似的事情。我不确定 boost 的累加器是这个任务的正确框架(如果不是,请建议!),但我还没有找到另一个现成的 O(n) 加权中位数的实现。
我现在的问题是,是否有办法用更优雅的构造替换下面的“for(int i=0;i<100;i++)”循环?
PS我已经看到了这个SO question,但目前还不清楚如何将答案转化为可操作的解决方案。
#include <Eigen/Dense>
#include <iostream>
#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/stats.hpp>
#include <boost/accumulators/statistics/median.hpp>
#include <boost/accumulators/statistics/weighted_median.hpp>
using namespace boost::accumulators;
using namespace Eigen;
int main(){
accumulator_set<float, stats<tag::median > > acc1;
accumulator_set<float, stats<tag::median >,int> acc2;
VectorXi rw=VectorXi::Random(100);
VectorXf rn=VectorXf::Random(100);
rw=rw.cwiseAbs();
for(int i=0;i<100;i++){
acc1(rn(i));
acc2(rn(i),weight=rw(i));
}
std::cout << " Median: " << median(acc1) << std::endl;
std::cout << "Weighted Median: " << median(acc2) << std::endl;
return 0;
}