【发布时间】:2016-12-21 18:25:27
【问题描述】:
我以前用过这个,但就是想不起来了,到处都找不到。
这是一个运行平均值,其中最新值的权重是所有先前值(组合)的两倍,因此随着时间的推移,最旧值的影响越来越小。而且我没有足够的内存来存储旧值。
平均:
int sum=0;
int n = 0;
float aver = 0;
for(;;){
float new_value = some_function();
sum += new_value;
++n;
aver = sum / n;
}
但是如何获得一个平均值,其中 new_value 的权重是之前平均值的两倍?
float aver = 0;
for(;;){
float new_value = some_function();
aver = aver * ??? + new_value * ???;
}
【问题讨论】:
-
aver = (aver + 2 * new_value) / 3; -
“所有先前值的权重的两倍”是指所有其他值的 组合 权重的两倍还是 最后一个值的两倍 价值?
-
上一个值的两倍。
-
“运行平均值”将使用第一个评论中的过滤器,或者使用环形缓冲区并将其值相加,在这种情况下,您将最近的值相加两次并除以
(n + 1).当然,您不会将n增加到超出环形缓冲区大小。 -
您能否展示一些样本数据的预期结果?假设传入的值是这 10 个:
1.11 8.63 4.31 5.54 7.79 8.35 3.79 6.40 3.15 6.29— 您希望计算(打印)什么?
标签: c algorithm weighted-average