Вычисление как взвешенной, так и невзвешенной статистики с одним и тем же boost :: gastulator_set? - PullRequest
1 голос
/ 23 июня 2010

С помощью аккумуляторов Boost я могу легко рассчитать статистические величины для взвешенных или невзвешенных входных наборов.Интересно, можно ли смешивать взвешенные и невзвешенные количества в одном и том же аккумуляторе?Глядя на документы , это не выглядит так.

Это прекрасно компилируется, но дает другой результат, чем мне бы хотелось:

using namespace boost::accumulators;

const double a[] = {1, 1, 1, 1, 1, 2, 2, 2, 2};
const double w[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

accumulator_set<double, features<tag::sum, tag::weighted_sum>, double> stats;
for (size_t i=0; i<9; ++i)
  stats(a[i], weight = w[i]);

std::cout << sum(stats) <<" "<< weighted_sum(stats) << std::endl;
// outputs "75 75" instead of "13 75"

Также сТретий параметр шаблона для accumulator_set Кажется, я всегда получаю взвешенные величины, даже при использовании «невзвешенной» функции и экстрактора:

accumulator_set<double, features<tag::sum>, double> stats;
for (size_t i=0; i<9; ++i)
  stats(a[i], weight = w[i]);
std::cout << sum(stats) << std::endl;
// outputs "75" instead of 13

Всегда ли мне нужно использовать два разных аккумулятора, если я хочу вычислитьвзвешенные и невзвешенные величины?

РЕДАКТИРОВАТЬ Я просто использую sum в качестве примера, на самом деле меня интересуют несколько более сложных величин.

1 Ответ

0 голосов
/ 23 июня 2010

В документации говорится, что

При указании веса все аккумуляторы в наборе заменяются их весовыми эквивалентами.

Возможно, есть лучшие способы сделать это, но вы можете попробовать что-то вроде этого (в основном, поменять значение значения на значение веса):

accumulator_set< double, stats< tag::sum, tag::sum_of_weights >, double > acc;
const double a[] = {1, 1, 1, 1, 1, 2, 2, 2, 2};
const double w[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

   for( int i = 0; i < sizeof( a ) / sizeof( a[ 0 ] ); i++ )
      acc( w[ i ], weight = a[ i ] );

   std::cout << extract_result< tag::sum >( acc ) << std::endl; // weighted sum, prints 75
   std::cout << extract_result< tag::sum_of_weights >( acc ) << std::endl; // sum, prints 13
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...