Можно ли использовать аккумуляторы Boost с векторами?

StackOverflow https://stackoverflow.com/questions/4316716

Вопрос

Я хотел использовать аккумуляторы 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 );
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top