Странные значения из 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 }

Однако я не описал эти два подхода. Вполне возможно, что ваш подход быстрее. Я считаю, что почтовый индекс и карта намного яснее и менее подвержены ошибкам, но другие могут чувствовать себя по-другому.

Другие вопросы по тегам