#c #boost #boost-accumulators
#c #повышение #наддув-аккумуляторы #boost-аккумуляторы
Вопрос:
Мне любопытно, какое среднее значение получается из этого фрагмента кода? Аккумулятор должен быть пустым.
boost::accumulators::accumulator_set<
int,
boost::accumulators::features<boost::accumulators::tag::mean>
> Accumulator;
int Mean = boost::accumulators::mean(Accumulator);
Среднее значение ненулевое, когда я его тестирую. Есть ли какой-нибудь способ определить, что среднее значение было взято для пустого набора данных? Почему результирующее значение для «среднего» не равно нулю?
Я просматривал документацию для библиотеки аккумуляторов, но не смог найти ответа на этот вопрос.
Комментарии:
1. Любое значение было бы допустимым средним значением для пустого набора значений, не так ли?
Ответ №1:
Любое значение будет допустимым средним значением для пустого набора значений. Это x * 0 = 0
справедливо для любого x
.
Вы можете добавить count
функцию в свой accumulator_set
и запросить ее, чтобы узнать, соответствует ли она 0.
Комментарии:
1. Хотя это может (как-то?) Быть математически правильным, я считаю это непрактичным. Разве не должно быть способа отличить «любое значение» от «среднего значения пустого набора»?
2. @Dylan Klomparens: разве добавление
count
функции для проверки наличия пустого набора не является для вас жизнеспособным решением?3. ДА. Менее элегантно, чем я бы предпочел.
Ответ №2:
Вам не нужно добавлять функцию подсчета, поскольку накопитель среднего значения основан на накопителях count и sum
из руководства пользователя boost:
среднее значение зависит от суммы и количества аккумуляторов … Результат среднего аккумулятора — это просто результат суммирующего аккумулятора, деленный на результат счетного аккумулятора.
итак, вам просто нужно проверить, что количество больше 0:
bool isEmpty = boost::accumulators::count(Accumulator) == 0;