2017-02-09 98 views
1

我正在研究加速計算Swift中數組的平均值和標準偏差。Swift加速的平均值和標準差

我可以做的意思。我該如何做標準偏差?

let rr: [Double] = [ 18.0, 21.0, 41.0, 42.0, 48.0, 50.0, 55.0, 90.0 ] 

var mn: Double = 0.0 

vDSP_meanvD(rr, 1, &mn, vDSP_Length(rr.count)) 

print(mn) // prints correct mean as 45.6250 

// Standard Deviation should be 22.3155 
+0

我想你可以從平均值計算它和「均方」(vDSP_measqvD)... –

+0

謝謝馬丁!你能告訴我vDSP_measqvD是如何工作的嗎?該參數有一個星號(*)。我仍然對使用這些東西感到困惑。 – Pat

+0

vDSP_measqvD與vDSP_meanvD具有完全相同的接口。 –

回答

1

可以計算從平均值和 標準偏差均方值(比較https://en.wikipedia.org/wiki/Standard_deviation#Identities_and_mathematical_propertieshttps://en.wikipedia.org/wiki/Algebraic_formula_for_the_variance):

import Accelerate 

let rr: [Double] = [ 18.0, 21.0, 41.0, 42.0, 48.0, 50.0, 55.0, 90.0 ] 

var mn: Double = 0.0 // mean value 
vDSP_meanvD(rr, 1, &mn, vDSP_Length(rr.count)) 

var ms: Double = 0.0 // mean square value 
vDSP_measqvD(rr, 1, &ms, vDSP_Length(rr.count)) 

let sddev = sqrt(ms - mn * mn) * sqrt(Double(rr.count)/Double(rr.count - 1)) 

print(mn, sddev) 
// 45.625 22.315513501982 

或者(適用於iOS 9.0及更高版本或MacOS的10.11及更高版本)使用vDSP_normalizeD

var mn = 0.0 
var sddev = 0.0 
vDSP_normalizeD(rr, 1, nil, 1, &mn, &sddev, vDSP_Length(rr.count)) 
sddev *= sqrt(Double(rr.count)/Double(rr.count - 1)) 

print(mn, sddev) 
// 45.625 22.315513501982 
+0

非常感謝馬丁!我只是想弄清楚這個公式。 – Pat

+0

@Pat:我添加了另一個可能的解決方案。 –

+0

再次感謝馬丁! – Pat