ソートされていない可変長の固有値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;
}