Я хотел бы получить weighted_median несортированного объекта переменной длины, собственного объекта c++ vectorXf. Кажется, я могу использовать функцию boost weighted_median из библиотеки статистических аккумуляторов boost, чтобы сделать это эффективно [?].
По сути, я пытаюсь сделать что-то очень похожее на то, что сделано здесь. Я не уверен, что аккумулятор boost является подходящей структурой для этой задачи (если нет, пожалуйста, посоветуйте!), но я не нашел другой реализации взвешенной медианы O (n) на полке.
На данный момент мой вопрос заключается в том, есть ли способ заменить приведенный ниже цикл for(int i=0;i‹100;i++) более элегантной конструкцией?
P.S. я видел этот ТАК вопрос, но не совсем понятно, как включить ответ там к рабочему решению.
#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;
}