c – boost :: weighted_median和eigen :: vectorXf –newbie

我想得到一个未排序的变量的weighted_median

长度,特征c vectorXf对象.看来我可以使用提升

boost的统计累加器的weighted_median函数

库有效地做到了[?].

从本质上讲,我正在尝试做一些与所做的非常相似的事情
here.我不确定boost的累加器是否是正确的框架
为此任务(如果不是请建议!),但我没有找到另一个
O(n)加权中位数的架外实现.

我现在的问题是,是否有办法取代
“for(int i = 0; i< 100; i)”由更优雅的构造在下面循环? 附:我见过this问题,但事实并非如此
真的很清楚如何把答案转到那里
可操作的解决方案.

#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;
}

最佳答案 你要做的是使用boost accumulators在某种容器中累积值.你会注意到甚至传递std :: vector< float>累加器将无法正常工作.累积器根本不适合这种方式使用.当然,你可以使用累加器来累积向量值或矩阵值 – 但这不是你在这里所追求的.

您可以使用std :: for_each来摆脱显式循环,这就是它:

// median
using boost::bind;
using boost::ref;
std::for_each(rn.data(), rn.data()+rn.rows(), bind<void>( ref(acc1), _1 ) );

您链接到的question在最新版本的Eigen3中不再相关.那里给出的代码运行得很好并产生正确的结果.

点赞