Можно ли использовать аккумуляторы Boost с векторами?
-
29-09-2019 - |
Вопрос
Я хотел использовать аккумуляторы Boost для расчета статистики переменной, которая является вектором. Есть ли простой способ сделать это. Я думаю, что невозможно использовать самую глупую вещь:
using namespace boost::accumulators;
//stuff...
accumulator_set<vector<double>, stats<tag::mean> > acc;
vector<double> some_vetor;
//stuff
some_vector = doStuff();
acc(some_vector);
Может быть, это очевидно, но я все равно пытался. :П
Я хотел иметь аккумулятор, который рассчитывал бы вектор, который является средством компонентов многих векторов. Есть легкий выход?
РЕДАКТИРОВАТЬ:
Я не знаю, был ли я совершенно ясен. Я не хочу этого:
for_each(vec.begin(), vec.end(),acc);
Это рассчитало бы среднее значение записей данного вектора. Что мне нужно, это другое. У меня есть функция, которая будет плевать векторы:
vector<double> doSomething();
// this is a monte carlo simulation;
И мне нужно запустить так много раз и рассчитать векторное среднее из этих векторов:
for(int i = 0; i < numberOfMCSteps; i++){
vec = doSomething();
acc(vec);
}
cout << mean(acc);
И я хочу, чтобы средний (ACC) был сам вектор, чья запись [i] была бы средством записей [i] накопленных векторов.
Есть намек на это в документах «Убийства», но ничего явного. И я немного тупой. :П
Решение
Я немного изучил ваш вопрос, и мне кажется, что Boost.ccumulators уже оказывают поддержку std::vector
. Отказ Вот что я мог найти в раздел руководства пользователя :
Еще один пример, в котором подлидаль числовых операторов полезна,-это когда тип не определяет перегрузки оператора, необходимые для его использования для некоторых статистических расчетов. Например,
std::vector<>
не перегружает никаких арифметических операторов, но может быть полезно использоватьstd::vector<>
в качестве образца или типа переменного тока. Подпадает числовых операторов определяет необходимые перегрузки оператора вboost::numeric::operators
Пространство имен, которое вносится в область скопления, с использованием директивы.
Действительно, после проверки файл boost/accumulators/numeric/functional/vector.hpp
делает Соблюдайте необходимые операторы для работы «наивного» для работы.
Я считаю, что вы должны попробовать:
- Включая любого
boost/accumulators/numeric/functional/vector.hpp
перед каким -либо другим заголовком аккумуляторовboost/accumulators/numeric/functional.hpp
при определенииBOOST_NUMERIC_FUNCTIONAL_STD_VECTOR_SUPPORT
- Привлечение операторов в сфере с помощью
using namespace boost::numeric::operators;
.
Осталось только одна последняя деталь: выполнение сломается во время выполнения, потому что начальное накопленное значение по умолчанию, и при попытке добавить вектор размера будет не к пустому вектору. Для этого кажется, что вы должны инициализировать аккумулятор (где не количество элементов в вашем векторе):
accumulator_set<std::vector<double>, stats<tag::mean> > acc(std::vector<double>(n));
Я попробовал следующий код, mean
дает мне std::vector
размера 2:
int main()
{
accumulator_set<std::vector<double>, stats<tag::mean> > acc(std::vector<double>(2));
const std::vector<double> v1 = boost::assign::list_of(1.)(2.);
const std::vector<double> v2 = boost::assign::list_of(2.)(3.);
const std::vector<double> v3 = boost::assign::list_of(3.)(4.);
acc(v1);
acc(v2);
acc(v3);
const std::vector<double> &meanVector = mean(acc);
}
Я считаю, что это то, что вы хотели?
Другие советы
У меня нет его настроения, чтобы попробовать прямо сейчас, но если все нуждаются в накоплении :: http://www.boost.org/doc/libs/1_37_0/libs/numeric/ublas/doc/vector.htm
А как же документация?
// The data for which we wish to calculate statistical properties:
std::vector< double > data( /* stuff */ );
// The accumulator set which will calculate the properties for us:
accumulator_set< double, features< tag::min, tag::mean > > acc;
// Use std::for_each to accumulate the statistical properties:
acc = std::for_each( data.begin(), data.end(), acc );