c++ - 使用 Boost 从 C++ 中的样本 vector 计算平均值和标准差

标签 c++ algorithm boost statistics mean

有没有办法使用 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/

相关文章:

c++ - 免费功能和单元测试

c++ - 将人类可读的日期转换为毫秒并在不丢失信息的情况下再次返回

c++ - Boost.Coroutine 和 Boost.Coroutine2 的区别

c++ - as_ldt_init 初始化失败——C++ 客户端

c++ - 从当前位置开始寻找零重置 eof 标志

java - 检查数组的降序

algorithm - 为什么算法第四版中快速排序的最坏情况成本与我计算的成本不匹配?

java - 在多个线程中划分合并排序算法

c++ - 流体模拟不可压缩流体

c++ - 任务不会使用 OpenMP 并行运行。我的设置或代码有误吗?