为什么 vDSP_maxv 找不到向量中的最大值?

Why doesn't vDSP_maxv find the max value in the vector?

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

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

我已阅读 this tutorial, the documentationvDSP_maxv 的头文件中的内联文档,但我不明白为什么下面的代码没有产生预期的结果。

使 numbers 成为 UnsafePointer 而不是 UnsafeMutablePointer 没有用,我尝试过的其他一些东西也没有用,所以也许我遗漏了一些基本的东西.

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
}

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

vDSP_maxv(::::)

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

在上面的伪代码中,I代表步幅参数,你会看到给I4(MemoryLayout<Float>.stride)会生成超过[=16=界限的索引](你的 numbers)。

其他一些部分已根据我的喜好进行了修复,但最重要的是 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
}