加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:31:14 所属栏目:百科 来源:网络整理
导读:我想得到一个未排序的变量的weighted_median 长度,特征c vectorXf对象.看来我可以使用提升 boost的统计累加器的weighted_median函数 库有效地做到了[?]. 从本质上讲,我正在尝试做一些与所做的非常相似的事情 here.我不确定boost的累加器是否是正确的框架 为
我想得到一个未排序的变量的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中不再相关.那里给出的代码运行得很好并产生正确的结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读