ContiguousArray到UnsafePointer的转换无法完成

问题描述 投票:0回答:1

我正在尝试从用户定义的Matrix类型调用cblas函数,该类型使用数组保存矩阵元素。代码的一种非常简化的形式在这里:

struct BoxArr{
    var y: Array<Double>
    init( y: Array<Double> ){
        self.y = y
    }
}

var A = BoxArr( y: [1.0, 2.0, 3.0] )
let s = cblas_dasum( Int32(A.y.count), A.y, 1 )
print(s)

上面的代码没有问题,正确的总和为6.0。请注意,函数cblas_dasum接收三个参数,它们是(1)数组中元素的数量,(2)指向包含数字的数组的指针,以及(3)跨步。我的第二个参数遇到类型转换问题。如果我像下面那样将结构成员y的类型从Array更改为ContiguousArray:

struct BoxContArr{
    var y: ContiguousArray<Double>
    init( y: ContiguousArray<Double> ){
        self.y = y
    }
}

var A = BoxContArr( y: [1.0, 2.0, 3.0] )
let s = cblas_dasum( Int32(A.y.count), A.y, 1 )
print(s)

我收到以下错误:

Cannot convert value of type 'ContiguousArray<Double>' to expected argument type 'UnsafePointer<Double>?'

[在前一种情况下,第二个自变量A.y的类型Array<Double>被隐式转换为UnsafePointer<Double>,但在后一种情况下,ContiguousArray<Double>没有转换为UnsafePointer<Double>。我不知道为什么会这样以及如何解决它。我更喜欢使用ContiguousArray以获得更好的性能。我在构造函数中制作了数组的浅表副本,但这并没有改变结果(在扩展实现中,完成了深表副本。)

arrays swift struct
1个回答
0
投票

指针必须指向缓冲区的第一个元素:

    var A = BoxContArr( y: [1.0, 2.0, 3.0] )
    A.y.withUnsafeBufferPointer { ptr in
        let s = cblas_dasum( Int32(A.y.count), ptr.baseAddress, 1 )
        print(s) // 6.0
    }
© www.soinside.com 2019 - 2024. All rights reserved.