我知道这是可以通过 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/