2013-07-08 53 views
0

我需要制定一個有效的移動整數算法。移動項目的平均值

例如,平均100個項目。 因此,作爲100號來了,平均1..100數.. 爲101數量達到平均2..101 .. 爲102數量達到平均3..102 ..

我想一個解決方案,但我不能上來,以便最小數量可以存儲(後面的病房,我必須做的微處理器,但首先,在C/C + +效率):

步驟1:存儲數字從1 .. 100取平均值 第2步:用101代替1,取平均值:101,2,3 ... 100 第3步:用102代替2,取平均值:101,102,3,4 ... 100

但它效率不高,因爲我需要使用更少的除法運算符。

任何人都可以幫助我。

+0

谷歌移動平均線 –

+1

如果您存儲上一步的總和(而不是平均值),則無需完全重新計算所有100個號碼的平均值。您只需從總和中減去一個值並添加新值,然後將總和除以100.但這並不會減少分部數量。 – jogojapan

+0

你*需要*使用除法運算符嗎?或者你只是想讓問題變得更難,解決方案「更快」? – Potatoswatter

回答

1

做移動平均最簡單的方法是移動的總和。總結數字n [0]到n [99]開始;對於下一個總和,減去n [0]並且加上n [100];對於下一個和,減去n [0]並且加上n [100]。平均值再次除以100。

這對整數效果最好,因爲總和中不會有任何舍入誤差;隨着浮點數的增加,任何錯誤都會累積,並隨着你的進展而變壞。

如果您使用正整數,您可以通過使窗口大小爲2的冪來消除除法。使用128而不是100意味着您可以使用總和上的右移7。

您還可以通過乘以逆來消除分割。而不是100除以1/100。如果你在使用整數,你可能需要使用固定點,如果你不小心,你也可能會用盡點數。

+0

所以你建議n [0]到n [99]的平均值後,我應該刪除n [0]並在n [0]位置添加n [100]我採取[100]數組.. – user2387900

+0

@ user2387900我的意思是保持從以前的計算總和,只是改變它。所以第一個和(sum0)是n [0]到n [99]的總和。第二個和(sum1)是sum0-n [0] + n [100]。第三個是sum1-n [1] + n [101]。等等。 –

2

你的基本方法很好:使用一個有100個元素的循環緩衝區。一個關鍵的洞察力:假設你處於「取代2×102」階段,2是50而102是70,總數將會改變+20的差異:你只需將新總數除以100即可得到新的平均,而不是再次加起來所有元素。

萬一,該司是如此緩慢它使一個顯著和問題的差異,以你的整體性能,那麼就只有一對夫婦的事情,你可以嘗試(但做衡量 - 他們實際上可能減慢你的速度取決於你的具體硬件):

一些奇異「配方」用於除以100上的「網,如 (((((uint32_t)A * (uint32_t)0x47AF) >> 16U) + A) >> 1) >> 6
+6

值得注意的是,這種方法可能會導致浮點運算中的數值問題(後加'x [n]'然後減''x [n]'可能不會完全取消)。在整數算術中,這完美地工作。 –

+0

此外,除非循環緩衝區尚未填滿,否則每次只有100個分區沒有考慮到這種情況。通常這可以被稱爲程序啓動的一部分。通常緩衝區大小可以是2的冪來簡化該部分。還請記住,在執行分區之前,通過將總和的一半緩衝區大小添加到總和來進行舍入。 – Potatoswatter

+0

@Patatoswatter:true - 我專注於可以在緩衝區滿的穩態模式下啓動一次的優化。 –