我有一些非常大的数组,我必须对其执行数百万次计算。在 Objective-C 中,数组将存储为 NSData,我会将它们抽象为 C 数组以使用 Accelerate 函数(求和、加法等)。但是,(考虑到到处使用指针的明显问题)我希望更多地使用边界检查 Swift 数组是否已内置。因此,我可以使用嵌套的 withUnsafeBufferPointer 来处理两个数组。
func mult(_ x: ArraySlice<Double>, _ y: ArraySlice<Double>) -> [Double] {
assert(x.count == y.count)
var results = [Double](repeating:0, count: x.count)
x.withUnsafeBufferPointer({xBuffer in
y.withUnsafeBufferPointer({yBuffer in
vDSP_vmulD([Double](xBuffer), 1, [Double](yBuffer), 1, &results, 1, vDSP_Length(xBuffer.count))
})
})
return results
}
var testArray = [Double]([0,1,2,3,4,5,6,7,8,9,10])
var testArray2 = [Double]([2,2,2,2,2,2,2,2,2,2,2])
let results = mult(testArray[5...10], testArray2[5...10])
print("\(results)")
首先,将指针重铸为预期类型似乎很奇怪,因为编译器已经知道如何转换 [Double] 本身(在块内传递的指针是 type UnsafeBufferPointer<Double>
,而 vDSP 函数是期望的UnsafePointer<Double>
(同样,没有如果我将数组变量本身传递给它))。其次,不得不嵌套withUnsafeBufferPointer
看起来很奇怪,虽然我了解用法。最后,如果我使用ArraySlice<Double>
作为输入参数类型,那么我不能将函数泛化为双精度数组和该数组的切片。
有一个更好的方法吗?