我有数据收集,其中每条记录都有关于此记录的车辆速度和时间的信息。每条记录之间的时差是不同的,大约是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条记录,所以我希望舍入不会对计算产生如此大的影响。
答案 0 :(得分:2)
您有一个价值对列表,即:
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
,并设置条目{{1 {}}到4:
和time = 1150
上面的示例当然有至少两个问题(很容易修复 - 例如你的作业): 1. 如果列表只有一个条目,代码将抛出异常。 2。删除项目后,speed = 49
会发生更改,但上面的代码无法识别。这意味着:删除任何条目后,它将抛出异常。
我还没有测试过,只是为了告诉你如何清理列表。
您还可以添加一些代码,以防止从列表中删除最后一个条目,因为否则您可能没有确切的最后时间值。也可以在相同的数据上多次运行,直到list.size()
保持不变。
(看看下面的评论)
答案 1 :(得分:0)
如果您不需要保留任何历史记录,则可以在检索新数据时更新行进距离。我不知道你是怎么做微积分的,我写的是我能想到的第一个例子。
Measurement record = null;
double distance = 0;
long totalTime = 0;
// New record handler
public void recordListener(Measurement newRecord) {
if(record != null) {
double avgSpeed = (record.speed + newRecord.speed) / 2.0;
long timeDelta = newRecord.time - record.time;
distance += avgSpeed * (timeDelta / 1000) // millis to seconds
totalTime += timeDelta;
}
record = newRecord;
}