4

ソートされていない可変長の固有値c++vectorXfオブジェクトのweighted_medianを取得したいと思います。Boostの統計アキュムレータライブラリのBoostweighted_median関数を使用して、それを効率的に行うことができるようです[?]。

本質的に、私はここで行われていることと非常によく似た何かをしようとしてい ます。Boostのアキュムレータがこのタスクに適したフレームワークであるかどうかはわかりませんが(アドバイスがない場合は!)、O(n)加重中央値のシェルフ実装に別のものは見つかりませんでした。

この時点での私の質問は、以下の「for(int i = 0; i <100; i ++)」ループをよりエレガントな構造に置き換える方法があるかどうかです。

PS私はこのSOの質問を見ましたが、そこで答えを操作可能な解決策に変える方法は本当に明確ではありません。

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

1 に答える 1

2

あなたがやろうとしているのは、ブーストアキュムレータを使用して、何らかのコンテナに値を蓄積することです。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 ) );

リンク先の質問は、Eigen3 の最新リリース バージョンでは関係ありません。そこに指定されたコードは問題なく実行され、正しい結果が生成されます。

于 2012-06-21T22:54:37.040 に答える