为什么 vDSP_maxv 找不到向量中的最大值?
Why doesn't vDSP_maxv find the max value in the vector?
vDSP_maxv
没有将最大值分配给下面代码中的 output
。
我希望最后一行打印 2
,但它每次都打印不同的东西,通常是非常大或非常小的数字,例如 2.8026e-45
我已阅读 this tutorial, the 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
}
您将步幅参数的用法误认为 vDSP_maxv
。
您需要传递组成一个步幅的元素数量,而不是字节数。
*C = -INFINITY;
for (n = 0; n < N; ++n)
if (*C < A[n*I])
*C = A[n*I];
在上面的伪代码中,I
代表步幅参数,你会看到给I
4(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
}
vDSP_maxv
没有将最大值分配给下面代码中的 output
。
我希望最后一行打印 2
,但它每次都打印不同的东西,通常是非常大或非常小的数字,例如 2.8026e-45
我已阅读 this tutorial, the 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
}
您将步幅参数的用法误认为 vDSP_maxv
。
您需要传递组成一个步幅的元素数量,而不是字节数。
*C = -INFINITY; for (n = 0; n < N; ++n) if (*C < A[n*I]) *C = A[n*I];
在上面的伪代码中,I
代表步幅参数,你会看到给I
4(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
}