boost ++ :: weighted_median和eigen :: vectorXf --newbie

时间:2012-06-21 22:30:16

标签: c++ boost eigen

我想得到一个未排序变量的weighted_median length,eigen c ++ vectorXf object。看来我可以使用提升 boost的统计累加器的weighted_median函数 库有效地做到了[?]。

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

我现在的问题是,是否有办法取代 “for(int i = 0; i< 100; i ++)”循环由一个更优雅的构造?

P.S。我见过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;
}

1 个答案:

答案 0 :(得分:2)

您要做的是使用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中不再相关。那里给出的代码运行得很好并产生正确的结果。