Swift中最后一个数组元素的UnsafePointer

时间:2016-02-05 02:15:49

标签: swift unsafe-pointers

我试图在加速here中使用vDSP_conv功能。 vDSP_conv的一个参数是const float *__F,"需要指向最后一个向量元素"。我不太熟悉在Swift中使用指针,所以我对如何创建指向Swift数组的最后一个数组元素的指针感到茫然。

任何人都可以提供一些见解吗?

/ **编辑** /

我要调用的函数规范: func vDSP_conv(_ __A: UnsafePointer<Float>, _ __IA: vDSP_Stride, _ __F: UnsafePointer<Float>, _ __IF: vDSP_Stride, _ __C: UnsafeMutablePointer<Float>, _ __IC: vDSP_Stride, _ __N: vDSP_Length, _ __P: vDSP_Length)

到目前为止,我有这段代码。我需要y指向数组中最后一个元素的指针,因为conv从数组的末尾开始并前进到前面

public func conv(x: [Float], y: [Float]) -> [Float] {
    var result = [Float](x)
    let inputLength:Int = x.count
    let outputLength:Int = inputLength + y.count - 1
    vDSP_conv(x, 1, y, 1, &result, 1, vDSP_Length(inputLength), vDSP_Length(outputLength))

    return result
}

1 个答案:

答案 0 :(得分:1)

withUnsafeBufferPointer()为您提供指向数组的指针 连续存储,您可以从中计算指针 最后一个数组元素:

func conv(x: [Float], y: [Float]) -> [Float] {
    var result = [Float](count: x.count - y.count + 1, repeatedValue: 0)

    y.withUnsafeBufferPointer { bufPtr in
        let pLast = bufPtr.baseAddress + y.count - 1
        vDSP_conv(x, 1, pLast, -1, &result, 1, vDSP_Length(result.count), vDSP_Length(y.count))
    }

    return result
}

(请注意,您对结果数组长度的计算不正确。)

示例:

print(conv([1, 2, 3], y: [4, 5, 6]))
// [ 28 ] = [ 1 * 6 + 2 * 5 + 3 * 6 ]

print(conv([1, 2, 3], y: [4, 5]))
// [ 13, 22 ] = [ 1 * 5 + 2 * 4, 2 * 5 + 3 * 4 ]