2017-02-09 129 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

相关问题