有没有办法使用 Boost 计算包含样本的 vector 的均值和标准差? ?
还是我必须创建一个累加器并将 vector 输入其中?
最佳答案
不知道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
可以使用 lambda 函数而不是 std::minus
来编写和 std::bind2nd
(现已弃用):
std::transform(v.begin(), v.end(), diff.begin(), [mean](double x) { return x - mean; });
关于c++ - 使用 Boost 从 C++ 中的样本 vector 计算平均值和标准差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7616511/