Я пытаюсь вызвать функции cblas из определенного пользователем типа Matrix, который использует массив для хранения элементов матрицы. Здесь очень упрощенная форма кода:
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 для возможно лучшей производительности. Я сделал мелкие копии массивов в конструкторе, но это не меняет результат (в расширенной реализации сделана глубокая копия.)