Я использую алгоритм dgeev
от LAPACK в структуре Accelerate для вычисления собственных значений и собственных векторов матрицы. Вот мой код:
var matrix:[__CLPK_doublereal] = [1,2,3,4,5,6,7,8,9]
var N = __CLPK_integer(sqrt(Double(matrix.count)))
var pivots = [__CLPK_integer](count: Int(N), repeatedValue: 0)
var workspace = [Double](count: Int(N), repeatedValue: 0.0)
var error : __CLPK_integer = 0
var lwork = __CLPK_integer(-1)
// Real parts of eigenvalues
var wr = [Double](count: Int(N), repeatedValue: 0)
// Imaginary parts of eigenvalues
var wi = [Double](count: Int(N), repeatedValue: 0)
// Left eigenvectors
var vl = [__CLPK_doublereal](count: Int(N*N), repeatedValue: 0)
// Right eigenvectors
var vr = [__CLPK_doublereal](count: Int(N*N), repeatedValue: 0)
dgeev_(UnsafeMutablePointer(("V" as NSString).UTF8String), UnsafeMutablePointer(("V" as NSString).UTF8String), &N, &matrix, &N, &wr, &wi, &vl, &N, &vr, &N, &workspace, &lwork, &error)
println("\(wr), \(vl), \(vr)")
Это печатает только массивы, содержащие нули, что означает, что они не изменяются функцией. Что я делаю неправильно?
ОБНОВЛЕНИЕ 1
Теперь у меня есть это:
var matrix:[__CLPK_doublereal] = [1,2,3,4,5,6,7,8,9]
var N = __CLPK_integer(sqrt(Double(matrix.count)))
var pivots = [__CLPK_integer](count: Int(N), repeatedValue: 0)
var workspaceQuery = [Double](count: 1, repeatedValue: 0.0)
var error : __CLPK_integer = 0
var lwork = __CLPK_integer(-1)
// Real parts of eigenvalues
var wr = [Double](count: Int(N), repeatedValue: 0)
// Imaginary parts of eigenvalues
var wi = [Double](count: Int(N), repeatedValue: 0)
// Left eigenvectors
var vl = [__CLPK_doublereal](count: Int(N*N), repeatedValue: 0)
// Right eigenvectors
var vr = [__CLPK_doublereal](count: Int(N*N), repeatedValue: 0)
dgeev_(UnsafeMutablePointer(("V" as NSString).UTF8String), UnsafeMutablePointer(("V" as NSString).UTF8String), &N, &matrix, &N, &wr, &wi, &vl, &N, &vr, &N, &workspaceQuery, &lwork, &error)
var workspace = [Double](count: Int(workspaceQuery[0]), repeatedValue: 0.0)
dgeev_(UnsafeMutablePointer(("V" as NSString).UTF8String), UnsafeMutablePointer(("V" as NSString).UTF8String), &N, &matrix, &N, &wr, &wi, &vl, &N, &vr, &N, &workspace, &lwork, &error)
println("\(wr), \(vl), \(vr)")
Тем не менее он печатает нули.