2017-02-09 6 views
1

私は、スウィフトの平均値と標準偏差を計算する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 

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を比較)から標準偏差を計算することができる:あるいは(IOSの9.0以降またはMacOSの10.11以降)

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 

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

もう一度Martinに感謝します! – Pat

関連する問題