Странные значения из vDSP_meanD
Я использую функцию vDSP_meanD, чтобы определить среднее значение набора данных (последовательные отличия от массива)
Код, который я использую ниже
func F(dataAllFrames:[Double],std:Double,medida:String)->Double{
let nframes=dataAllFrames.count
var diferencas_consecutivas_media = [Double](count: dataAllFrames.count-1, repeatedValue:0.0)
var mediaDifConseq:Double = 0
for(var i:Int=1; i<dataAllFrames.count; i++){
diferencas_consecutivas_media[i-1]=dataAllFrames[i]-dataAllFrames[i-1]
}
var meanConseqDif = [Double](count: 1, repeatedValue:0.0)
var meanConseqDifPtr = UnsafeMutablePointer<Double>(meanConseqDif)
vDSP_meanvD(diferencas_consecutivas_media,1,meanConseqDifPtr,UInt(nframes))
print( meanConseqDif[0])
}
Функция F вызывается в блоке потока
let group = dispatch_group_create()
let queue = dispatch_queue_create("myqueue.data.processor", DISPATCH_QUEUE_CONCURRENT)
dispatch_group_async(group, queue) {
F(measureData,std: std, medida: medida)
}
Функция F вызывается в множественном диспетчерском блоке с разными экземплярами переменных каждый раз, а затем я получаю разные значения для значения, возвращаемого из vDSP_meanD. Есть ли контекст, где это может произойти? Может ли вызов потока иметь какое-то влияние на это? Любые "огни" будут с благодарностью
1 ответ
Я не ожидал бы, что этот код будет работать. Это не должно быть правильно:
var meanConseqDif = [Double](count: 1, repeatedValue:0.0)
var meanConseqDifPtr = UnsafeMutablePointer<Double>(meanConseqDif)
vDSP_meanvD(diferencas_consecutivas_media,1,meanConseqDifPtr,UInt(nframes))
Я полагаю, что это указывает непосредственно на структуру Array, поэтому вы, вероятно, удаляете метаданные, а не обновляете значение, которое вы имели в виду. Но я ожидаю, что в этом случае вы не получите правильных ответов. Подтвердили ли вы, что ваши результаты обычно верны?
Я думаю, что код, который вы имеете в виду, выглядит так:
func F(dataAllFrames: [Double], std: Double, medida: String) -> Double {
let nframes = UInt(dataAllFrames.count)
var diferencas_consecutivas_media = [Double](count: dataAllFrames.count-1, repeatedValue:0.0)
for(var i = 1; i < dataAllFrames.count; i += 1) {
diferencas_consecutivas_media[i-1] = dataAllFrames[i] - dataAllFrames[i-1]
}
var mediaDifConseq = 0.0
vDSP_meanvD(diferencas_consecutivas_media, 1, &mediaDifConseq, nframes)
return mediaDifConseq
}
Вам не нужен выходной массив для сбора одного результата. Вы можете просто использовать Double напрямую и использовать &
взять небезопасный указатель на него.
Несвязанная точка, но вы можете избавиться от всего кода, генерирующего разницу, с помощью одного zip и карты:
let diferencasConsecutivasMedia = zip(dataAllFrames, dataAllFrames.dropFirst())
.map { $1 - $0 }
Однако я не описал эти два подхода. Вполне возможно, что ваш подход быстрее. Я считаю, что почтовый индекс и карта намного яснее и менее подвержены ошибкам, но другие могут чувствовать себя по-другому.