c++ - 如何计算均值(平均)robuSTLy?

标签 c++ algorithm floating-point

如果我们天真地计算均值:

std::vector<double> values;
double sum = std::accumulate(begin(values), end(values), 0.0);
double mean = sum / values.size();

values.size() 很大,我们可能会得到不准确的结果,因为 float 在较高范围内分辨率较低。或者更糟,如果我理解正确,我们可以获得无限的结果。

当我们有一个偶数的值时,我们可以计算前半部分的平均值,然后计算后半部分的平均值,然后找到这两个平均值的平均值

这似乎不是一个新问题,但我很难找到资源。我认为有更复杂的技术

权衡
  • 稳健性
  • 计算复杂度
  • 实现难度

我想知道是否有人在某处总结了它们,或者如果它们在某些中可用,甚至更好。

最佳答案

您可以使用描述的在线算法 here .

基本上(在 pythonish 伪代码中):

n = 0
mean = 0

for value in data:
    n += 1
    mean += (value - mean)/n

该算法在数值上比单纯的实现更稳定。

关于c++ - 如何计算均值(平均)robuSTLy?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23813278/

相关文章:

java - 带星号的矩形 Java

Java - 使用 double 更精确

c++ - 从套接字中读取少于可读取的数量

c++ - qt 绕 x 轴和 y 轴旋转

c++ - 如何在编辑控件中显示 LPVOID 类型的字符串

algorithm - 从链表中有效地选择一组随机元素

c++ - GraphicsMagick.NET 缺少 CORE_RL_bzlib_.lib 文件,C++ 链接器错误?

algorithm - 如何从次线性空间/时间中的字符流计算回文?

c# - 未初始化的浮点变量,重新定义不确定的行为

c - 为什么 isnormal() 说一个值是正常的,而实际上不是?