[英]Matrix inversion in Swift using Accelerate Framework
按照我在這里找到的好的指示: https : //github.com/haginile/SwiftAccelerate我驗證了矩陣反轉是有效的。 事實上它確實給出了給出的例子。 但是我得到任何其他矩陣(大於2x2)的EXC_BAD_ACCESS
錯誤,例如下面的2D矩陣(轉換為1D數組)已成功在matlab和python中測試過,它不起作用
m = [0.55481645013013, -1.15522603580724, 0.962090414322894, -0.530226035807236, 0.168545207161447, -0.38627124296868, 0.93401699437494, -0.999999999999995, 0.684016994374945, -0.23176274578121, 0.123606797749979, -0.323606797749979, 0.432893622827287, -0.323606797749979, 0.123606797749979, 0.231762745781211, -0.684016994374948, 1.0, -0.934016994374947, 0.386271242968684, 0.168545207161448, -0.530226035807237, 0.962090414322895, -1.15522603580724, 0.554816450130132]
它的倒置矩陣應該是
inv(AA)
ans =
Columns 1 through 3
-262796763616197 -656991909040516 4.90007819375216
-162417332048282 -406043330120712 14.6405748712708
0.718958226823704 7.87760147961979 30.4010295628018
162417332048287 406043330120730 46.1614842543337
262796763616208 656991909040536 55.9019809318537
Columns 4 through 5
-656991909040528 262796763616211
-406043330120721 162417332048287
-4.28281034550088 -0.718958226823794
406043330120704 -162417332048283
656991909040497 -262796763616196
你能否在Swift中給我另一種矩陣求逆方法? 或者解釋一下如何解決這個問題? 我真的不明白為什么它不起作用。
它不起作用,因為您找到的說明不太好。 具體來說,樞軸和工作空間都需要是數組,而不是標量值; 它只是偶然機會用於2乘2矩陣。
這是invert
函數的修改版本,可以正確分配工作空間:
func invert(matrix : [Double]) -> [Double] {
var inMatrix = matrix
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
dgetrf_(&N, &N, &inMatrix, &N, &pivots, &error)
dgetri_(&N, &inMatrix, &N, &pivots, &workspace, &N, &error)
return inMatrix
}
我還應該注意到你的5x5矩陣是非常惡劣的,所以即使你可以計算“逆”,該計算的誤差也會非常大,並且實際上不應該使用逆。
一個Swift 4版本:
func invert(matrix : [Double]) -> [Double] {
var inMatrix = matrix
var N = __CLPK_integer(sqrt(Double(matrix.count)))
var pivots = [__CLPK_integer](repeating: 0, count: Int(N))
var workspace = [Double](repeating: 0.0, count: Int(N))
var error : __CLPK_integer = 0
withUnsafeMutablePointer(to: &N) {
dgetrf_($0, $0, &inMatrix, $0, &pivots, &error)
dgetri_($0, &inMatrix, $0, &pivots, &workspace, $0, &error)
}
return inMatrix
}
我在Swift中編寫了一個線性代數庫。 我將此庫稱為swix,它包含反轉矩陣的函數(此函數稱為inv
)。
用例示例:
var b = ones(10)
var A = rand((10, 10))
var AI = inv(A)
var x = AI.dot(b)
資料來源: https : //github.com/stsievert/swix
文檔: http : //scottsievert.com/swix/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.