我正在開發一個使用GPS的android應用程序。我想實現一項功能,可以在1/5/15分鐘內顯示用戶的平均速度。類似於unix上的CPU負載。我可以很容易地計算出平均值,然後將經過的時間除以它,但我想不出一個聰明的方法來計算移動平均值。如何計算來自GPS的移動平均速度?
很顯然,我可以通過在刪除最早的值時每秒將最後一個數組與當前位置之間的距離放在數組中來完成id。
我正在尋找一個乾淨利落的做法。
我正在開發一個使用GPS的android應用程序。我想實現一項功能,可以在1/5/15分鐘內顯示用戶的平均速度。類似於unix上的CPU負載。我可以很容易地計算出平均值,然後將經過的時間除以它,但我想不出一個聰明的方法來計算移動平均值。如何計算來自GPS的移動平均速度?
很顯然,我可以通過在刪除最早的值時每秒將最後一個數組與當前位置之間的距離放在數組中來完成id。
我正在尋找一個乾淨利落的做法。
您將需要存儲整個時間跨度的所有值,如您已經建議的那樣。原因在於你不知何故需要「忘記」舊值對移動平均線的貢獻。如果您不知道這些值在哪裏(即,如果您不存儲它們),則無法完全做到這一點。
在你的情況下,15分鐘每秒1個值等於15 * 60 = 900個數據點,應該是OK。
請注意,每次更新時不需要對整個數組執行求和:您可以根據數據點數,新值以及您在該處「忘記」的值來計算新移動平均值時刻:
new_average = (n * old_average - x_forget + x_new)
這裏,n
是數據點(在你的案件900)的數量,x_forget
是你「忘記」和x_new
是最新值的值。然後,您從陣列的正面放下x_forget
,並在末尾存儲x_new
。您可能希望使用通過鏈接列表實現的隊列,而不是數組。
繼承人之一,去了解它,這是非常直接的方式:
如果您正在取樣位置每秒901個保持樣品中排隊,那是15分鐘的價值(1額外的)。 位置0是最近的測量值,有效地表示您當前的位置。
對於平均速度在過去的X分鐘:
s = X * 60;
point1 = postion_queue[0]; // this is your current position
point2 = postion_queue[s]; // this is your position s seconds ago
d = distance_between_points(point1, point2);
speed = d/s;
speed
現在距離單位每秒,轉換爲英里,或KPH或任何你需要的單位。不同的X值可用於1到15分鐘之間的任何平均值。