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

时间:2017-12-16 02:38:56

标签: swift unsafe-pointers vdsp unsafemutablepointer accelerate

BlockOperation未在下面的代码中将最大值分配给vDSP_maxv

我预计最后一行会打印output,但每次都打印不同的内容,通常是非常大或小的数字,例如2

我已阅读this tutorialdocumentation以及2.8026e-45标题文件中的内联文档,但我不明白为何下面的代码不是&n #39; t产生预期的结果。

vDSP_maxv numbers代替UnsafePointer没有工作,也没有其他一些我尝试过的事情,所以也许我'我缺少一些基本的东西。

UnsafeMutablePointer

1 个答案:

答案 0 :(得分: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参数,你看到给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
}