Я не знаю, имеет ли Boost более специфические функции, но вы можете сделать это с помощью стандартной библиотеки.
Учитывая std::vector<double> v
, это наивный способ:
#include <numeric>
double sum = std::accumulate(v.begin(), v.end(), 0.0);
double mean = sum / v.size();
double sq_sum = std::inner_product(v.begin(), v.end(), v.begin(), 0.0);
double stdev = std::sqrt(sq_sum / v.size() - mean * mean);
Это подвержено переполнению или недостаточному значению для огромных или крошечных значений. Несколько лучший способ вычислить стандартное отклонение:
double sum = std::accumulate(v.begin(), v.end(), 0.0);
double mean = sum / v.size();
std::vector<double> diff(v.size());
std::transform(v.begin(), v.end(), diff.begin(),
std::bind2nd(std::minus<double>(), mean));
double sq_sum = std::inner_product(diff.begin(), diff.end(), diff.begin(), 0.0);
double stdev = std::sqrt(sq_sum / v.size());
ОБНОВЛЕНИЕ для C ++ 11:
Вызов std::transform
может быть записан с использованием лямбда-функции вместо std::minus
и std::bind2nd
(теперь не рекомендуется):
std::transform(v.begin(), v.end(), diff.begin(), [mean](double x) { return x - mean; });