【问题标题】:How to call a DSP function with OpaquePointer?如何使用 OpaquePointer 调用 DSP 函数?
【发布时间】:2016-11-20 18:00:52
【问题描述】:

来自向量标量线性代数函数(来自 vectorOps.h) https://developer.apple.com/reference/accelerate/1546030-visamax

func vIsamax(_ count: Int32, _ x: OpaquePointer) -> Int32)

计数 向量 x 中的元素数;必须是 4 的倍数。

x 浮点值的向量数组。

我尝试了以下解决方案 https://swift.org/migration-guide/se-0107-migrate.html UnsafeRawPointerwithUnsafePointerMemoryLayout 等 目前还没有成功

无法使用 ... CFData 调用类型“OpaquePointer”的初始化程序,

不能用...调用 " " yada, yada, yada

如何使用 OpaquePointer 调用 DSP 函数?

【问题讨论】:

  • 显示您的代码。
  • 我从迁移页面经历了 15 种不同的变化
  • 请注意,您确实不应该使用vIsamax,它仅用于遗留支持。您应该使用cblas_isamaxvDSP_maxmgvi 代替(它们更快,也可以在iOS 等新平台上使用,但vIsamax 仅适用于OS X——它们也有更准确的文档,因为它们正在积极开发中)。

标签: swift swift3 accelerate-framework


【解决方案1】:

vIsamaxvFloat 又名float4 元素的向量作为参数。 (每个 float4 包含 4 个浮点数。) C 声明是

int32_t vIsamax(int32_t count, const vFloat *x);

应该将哪个映射到Swift

public func vIsamax(_ count: Int32, _ x: UnsafePointer<vFloat>) -> Int32

而不是

public func vIsamax(_ count: Int32, _ x: OpaquePointer) -> Int32

但是您可以简单地传递一个vFloat/float4 数组,如下所示 小例子:

import Swift
import Accelerate
import simd

let values = [ float4(-1.0, -2.0, -3.0, -4.0), float4(4.0, 3.0, 2.0, 1.0) ]
let idx = vIsamax(Int32(4 * values.count), values)
print(idx) // 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多