0

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 から返された値に対して異なる値を取得します。これが発生するコンテキストはありますか? スレッド呼び出しがそれに何らかの影響を与える可能性がありますか? どんな「ライト」でも大歓迎です

4

1 に答える 1

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 }

ただし、これら 2 つのアプローチのプロファイルは作成していません。あなたのアプローチがより速い可能性があります。郵便番号と地図はより明確でエラーが発生しにくいと思いますが、他の人は違うと感じるかもしれません.

于 2016-02-03T22:15:50.313 に答える