Можно ли использовать форсированные аккумуляторы с векторами? - PullRequest
13 голосов
/ 30 ноября 2010

Я хотел использовать буст-аккумуляторы для расчета статистики переменной, которая является вектором. Есть ли простой способ сделать это. Я думаю, что невозможно использовать самую глупую вещь:

  using namespace boost::accumulators;
  //stuff...

  accumulator_set<vector<double>, stats<tag::mean> > acc;
  vector<double> some_vetor;
  //stuff 
  some_vector = doStuff();
  acc(some_vector);

может быть, это очевидно, но я все равно попробовал. : P

Я хотел иметь аккумулятор, который вычислял бы вектор, который является средним для компонент многих векторов. Есть ли легкий выход?

EDIT:

Я не знаю, был ли я полностью ясен. Я не хочу этого:

 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 есть подсказка об этом, но ничего явного. И я немного тупой. : P

Ответы [ 3 ]

9 голосов
/ 06 декабря 2010

Я немного изучил ваш вопрос, и мне кажется, что Boost.Accumulator уже обеспечивает поддержку std::vector.Вот что я мог найти в разделе руководства пользователя :

Еще один пример, где полезна библиотека числовых операторов, - это когда тип не определяет перегрузки операторовтребуется использовать его для некоторых статистических расчетов. Например, std::vector<> не перегружает никакие арифметические операторы, однако может быть полезно использовать std::vector<> в качестве типа выборки или типа переменной.Подбиблиотека «Числовые операторы» определяет необходимые перегрузки операторов в пространстве имен boost::numeric::operators, которое вводится в область действия Accumulators Framework с помощью директивы using.

Действительно, после проверкифайл 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;.

Осталась только одна последняя деталь: выполнение будет прервано во время выполнения, потому что начальное накопленное значение построено по умолчанию, и при попытке добавить вектор размера n будет выполнено утверждениепустой вектор.Для этого, кажется, вам следует инициализировать аккумулятор с помощью (где n - количество элементов в вашем векторе):

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);
}

Я полагаю, это то, что вы хотели?

2 голосов
/ 30 ноября 2010

Я не настроил его на попытку прямо сейчас, но если все, что нужно для boost :: аккумуляторов, это правильно определенные математические операторы, то вам, возможно, удастся выбрать другой тип вектора: http://www.boost.org/doc/libs/1_37_0/libs/numeric/ublas/doc/vector.htm

0 голосов
/ 30 ноября 2010

А как насчет документации ?

// 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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...