2017-02-09 13 views
1

Я ищу Ускорение для вычисления среднего и стандартного отклонения массивов в 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_properties и https://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 

В качестве альтернативы (для прошивки 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