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

问题描述 投票:0回答:1

vDSP_maxv未在下面的代码中为output分配最大值。

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

我已经阅读了this tutorialdocumentation以及vDSP_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
}
swift unsafe-pointers vdsp unsafemutablepointer accelerate
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代表步幅参数,你看到给MemoryLayout<Float>.stride 4(I)会产生超过A(你的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
}
© www.soinside.com 2019 - 2024. All rights reserved.