【问题标题】:Strange values from vDSP_meanD来自 vDSP_meanD 的奇怪值
【发布时间】:2016-05-11 11:14:11
【问题描述】:

我正在使用 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 返回的值的不同值是否有任何可能发生这种情况的上下文? 线程调用可能对此有一些影响吗? 任何“灯”将不胜感激

【问题讨论】:

    标签: swift accelerate-framework vdsp


    【解决方案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,然后使用 &amp; 获取指向它的不安全指针。

    无关的点,但您可以使用单个 zip 和地图摆脱所有产生差异的代码:

    let diferencasConsecutivasMedia = zip(dataAllFrames, dataAllFrames.dropFirst())
        .map { $1 - $0 }
    

    不过,我还没有介绍这两种方法。您的方法可能更快。我发现 zip 和地图更清晰,更不容易出错,但其他人可能会有不同的感觉。

    【讨论】:

      猜你喜欢
      • 2015-12-24
      • 1970-01-01
      • 2014-11-09
      • 1970-01-01
      • 2011-01-17
      • 2020-02-10
      • 2015-05-21
      • 2010-10-27
      • 2014-01-22
      相关资源
      最近更新 更多