我有数据收集,其中每条记录都包含有关车辆速度和记录时间的信息。每条记录之间的时间差是不同的,大约300毫秒。我使用这个集合来计算行进距离。我想在不损失太多计算准确性的情况下修剪这个集合。有什么算法吗?
我尝试编写简单的算法,如果记录与之前的记录相差至少 X %,则删除记录。该算法效果不佳。例如,当我使用 3% 和 4% 修剪的算法时,记录数相同但计算的距离在 500 米距离上相差 40 米,其中 4% 更准确。
编辑:本杰明算法的变化:
我有时间收集记录,所以我需要 3 条记录。
double timeDifference = (next.time - curr.time)/(curr.time - previous.time);
previuos.value = (previous.value + curr.value * timeDifference)/2
此外,我不希望结果为双倍但很长,因此我需要使用会改变距离的舍入。另外一分钟大约有 300 条记录,所以我希望四舍五入不会对计算产生太大影响。
最佳答案
您有一个值对列表,即:
time | speed
1: 0 | 0
2: 300 | 10
3: 600 | 40
4: 900 | 48
5: 1200 | 50
6: 1500 | 30
7: 1800 | 0
你总是需要查看两个值 i
和 i-1
.我们从 i=1
开始因为否则我们将访问索引 -1
:
for(int i=1; i<list.size(); i++) {
if(Math.abs(list.get(i).speed - list.get(i-1).speed) < 3) {
list.get(i-1).time = (list.get(i).time + list.get(i-1).time) / 2;
list.get(i-1).speed = (list.get(i).speed + list.get(i-1).speed) / 2;
list.remove(i);
}
}
换句话说: 如果 i
之间的速度差异和 i-1
小于 3,则更新条目 i-1
并将其时间和速度设置为 i
的平均值和 i-1
.之后我们删除项目 i
从列表中。
示例数据会发生什么:此代码删除条目 5:
来自示例数据,因为 abs(50-48) = 2
和 2 < 3
, 并设置条目 4:
至 time = 1150
和 speed = 49
上面的例子当然有至少两个问题(很容易解决——例如你的作业):1.如果列表只有一个条目,代码将抛出异常。 2. 删除项目后,list.size()
更改,但上面的代码将无法识别。这意味着:删除任何条目后,它将抛出异常。
我还没有测试过,只是为了向您展示如何清理列表。
您还可以添加一些代码,以防止从列表中删除最后一个条目,否则您可能不会获得准确的最后时间值。也可以对同一数据运行多次,直到 list.size()
保持不变。
(看看下面的评论)
关于java - 用于计算距离的修剪集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31363846/