c++ - 在 C++ 中计算滚动/移动平均值

标签 c++ boost moving-average

我知道这是可以通过 boost 实现的:

Using boost::accumulators, how can I reset a rolling window size, does it keep extra history?

但我真的很想避免使用 boost。我用谷歌搜索,没有找到任何合适或可读的例子。

基本上,我想使用最近的 1000 个数字作为数据样本来跟踪正在进行的 float 流的移动平均值。

实现这一目标的最简单方法是什么?


我尝试使用圆形数组、指数移动平均线和更简单的移动平均线,发现圆形数组的结果最适合我的需要。

最佳答案

如果您的需求很简单,您可以尝试使用指数移动平均线。

http://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average

简单地说,您创建了一个累加器变量,当您的代码查看每个样本时,代码会使用新值更新累加器。您选择一个介于 0 和 1 之间的常量“alpha”,然后计算:

accumulator = (alpha * new_value) + (1.0 - alpha) * accumulator

您只需要找到一个“alpha”值,其中给定样本的效果仅持续大约 1000 个样本。

嗯,我不确定这是否适合你,现在我已经把它放在这里了。问题是 1000 是指数移动平均线的一个相当长的窗口。我不确定是否有一个 alpha 可以将平均值分布在最后 1000 个数字上,而不会在浮点计算中出现下溢。但是,如果您想要一个较小的平均值,例如 30 个左右的数字,这是一种非常简单快捷的方法。

关于c++ - 在 C++ 中计算滚动/移动平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10990618/

相关文章:

c++ - 如何在 C++ 中正确返回运算符 (*,/,-,+)?

python - 如何使用 Boost.Python 使用带有 std::map 或 std::vector 参数的构造函数来包装 C++ 类?

google-sheets - 如何计算列中最后七个值的平均值?

python - 如何计算 n 行的平均值并将答案粘贴到 pandas 列的下 n 行?

c++ - 我的程序只输出最高元素 1

c++ - Cpp Friend 函数无法访问私有(private)静态成员

c++ - 尝试创建一个对象并将其打印到输出

c++ - 将 boost::unordered_set 作为结果映射传递给 boost::split

c++ - 如何在类定义中声明基本截止时间计时器

r - R 中的累积和、移动平均数和 SQL "group by"等价物