0

vDSP_maxv没有在下面的代码中分配最大值output

我希望最后一行 print 2,但它每次都打印不同的东西,通常是一个非常大或小的数字,比如2.8026e-45

我已经阅读了本教程文档和头文件中的内联文档vDSP_maxv,但我不明白为什么下面的代码没有产生预期的结果。

制作numbersanUnsafePointer而不是 anUnsafeMutablePointer没有用,我尝试过的其他一些事情也没有,所以也许我错过了一些基本的东西。

import Accelerate

do {
    // INPUT - pointer pointing at: 0.0, 1.0, 2.0
    let count = 3
    let numbers = UnsafeMutablePointer<Float>
        .allocate(capacity: count)
    defer { numbers.deinitialize() }
    for i in 0..<count {
        (numbers+i).initialize(to: Float(i))
    }

    // OUTPUT
    var output = UnsafeMutablePointer<Float>
        .allocate(capacity: 1)

    // FIND MAX
    vDSP_maxv(
        numbers,
        MemoryLayout<Float>.stride,
        output,
        vDSP_Length(count)
    )
    print(output.pointee) // prints various numbers, none of which are expected
}
4

1 回答 1

1

您将 stride 参数的用法误认为是vDSP_maxv. 您需要传递组成单个步幅的元素数,而不是字节数。

vDSP_maxv( : : : :)

*C = -INFINITY;
for (n = 0; n < N; ++n)
    if (*C < A[n*I])
        *C = A[n*I];

在上面的伪代码中,I代表 stride 参数,您看到给 4 ( MemoryLayout<Float>.stride)会生成超出(your )I边界的索引。Anumbers

修复了一些其他部分以适合我的喜好,但最重要的是第二个参数vDSP_maxv

import Accelerate

do {
    // INPUT - pointer pointing at: 0.0, 1.0, 2.0
    let numbers: [Float] = [0.0, 1.0, 2.0]

    // OUTPUT
    var output: Float = Float.nan

    // FIND MAX
    vDSP_maxv(
        numbers,
        1, //<- when you want to use all elements in `numbers` continuously, you need to pass `1`
        &output,
        vDSP_Length(numbers.count)
    )
    print(output) //-> 2.0
}
于 2017-12-16T04:49:22.257 回答