vDSP_maxv
未在下面的代码中为output
分配最大值。
我期望最后一行打印2
,但它每次打印不同的东西,通常是一个非常大或小的数字,如2.8026e-45
我已经阅读了this tutorial,documentation以及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
}
你误将stride参数的用法误认为是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
}