2015-05-27 100 views
0

我是新去的,我做了以下內容:如何計算非零值的加權平均值?

我有一個片:

valueList := []int16{500, 400, 0, 300} 

和重量片:

weightList := []float64{0.1, 0.2, 0.3, 0.4} 

現在,我想這樣做:

res := make([]float64, 4) 
for i, value := range valueList { 
    res[i] = float64(value) * weightList[i] 
} 

但正如你所看到的,我得到一個0valueList,現在我要重均別人如果值不爲0,所以在這個例子中,它應該是:

500 * (0.1 + 0.3/3) + 400 * (0.2 + 0.3/3) + 300 * (0.4 + 0.3/3) 

如果另一個0顯示出來,再平均重量。

我該如何做到這一點?

+1

你不能在'[] int16'切片或數組中有'nil'值。這是編譯時錯誤。在發佈問題之前,你應該真的嘗試你的示例代碼。 – icza

+0

@icza ....,我怎麼能有類似的事情?我是golang的新手 – roger

回答

3

可以計算非零值的總和重量,同時遍歷它們,並在年底的總重量做了分工:

vs := []int{500, 400, 0, 300} 
ws := []float64{0.1, 0.2, 0.3, 0.4} 

sumWeight, avg := 0.0, 0.0 
for i, v := range vs { 
    if v == 0 { 
     continue 
    } 
    sumWeight += ws[i] 
    avg += float64(v) * ws[i] 
} 
avg /= sumWeight 

fmt.Println("Average:", avg) 

輸出(嘗試在Go Playground):

Average: 357.1428571428571 

注:

這個解決方案並不需要權重相加爲1.0也不在0..1的範圍內(但不能爲負數)。

注2:

如果輸入切片是空的(由具有len == 0或所有值是0)或非零值的sumWeight0.0,其結果將是NaN由於通過分割sumWeight這是0.0。你可能想檢查這個案例並做其他事情:

if sumWeight > 0.0 { 
    avg /= sumWeight 
} 
+0

令人驚歎,我爲什麼這麼愚蠢 – roger