gpt4 book ai didi

java - 使用时间窗计算移动平均线

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:50:30 24 4
gpt4 key购买 nike

我想计算一个时间窗口内的移动平均值:

//object init
MovingAverageTimeBased movTime = new MovingAverageTimeBased(8000f);

//this gets called every Frame (around 180 FPS -- but varies of course)
movingAvg = movTime.next(value, System.currentTimeMillis());

这是类:

public class MovingAverageTimeBased {

float windowsize;
Queue<Float> queue;
Queue<Float> timestampQueue;
float sum;
float lastItemDeleted;

public MovingAverageTimeBased(float windowsize) {
this.windowsize = windowsize;
this.queue = new LinkedList<Float>();
this.timestampQueue = new LinkedList<Float>();

this.sum = 0;
}

public double next(float n, float timestamp) {

if(queue.size() > 1 && timestampQueue.size() > 1) {

System.out.println("Timestamp diff- " + (timestamp - (float) timestampQueue.peek()));

while (timestamp - (float) timestampQueue.peek() > windowsize) {
System.out.println("Unqueue item");

sum = sum - (float) queue.poll();
timestampQueue.poll();
}
}

queue.offer(n);
timestampQueue.offer(timestamp);

sum = sum + n;
return (float) sum / queue.size();
}

}

我的错误是,条目似乎永远不会被删除,因为时间戳的差异始终为 0?

可能是什么错误?

最佳答案

最大的问题是您为时间戳使用了 Queue<Float>

System.currentTimeMillis() 当前为 1544100776456

四舍五入到最接近的 float ,这是 1.5441007E12

如您所见,我们丢失了一些数字。您需要等待大约一分钟,浮点值才会更改。

您应该在该队列中使用 Long 或 Double。

然后您必须为 while 循环的每次 迭代检查队列大小 > 0,而不仅仅是第一个迭代。

关于java - 使用时间窗计算移动平均线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53651987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com