我正在使用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返回的值得到不同的值是否存在可能发生这种情况的任何上下文? 线程调用可能会对此产生一些影响吗? 任何“灯光”都会非常感激
答案 0 :(得分:0)
我不希望这段代码有效。这不应该是正确的:
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 }
但是,我没有介绍这两种方法。您的方法可能更快。我发现拉链和贴图更清晰,更不易出错,但其他人可能会有不一样的感受。