Matrix Inversion including determinant calculation by Gauss-Jordan Elimination with maximization of pivot elements. (線上執行) (原始碼下載)
這裡提供的程式基本上是和以前那個程式一樣的功能,都是解決矩陣求逆的問題,但是這個程式多計算一項額外的數據 Determinant,如此可讓我們知道這個矩陣的逆矩陣是否存在,以及判斷這個矩陣是否可能為 ill-conditioned。以下僅列出副程式供參考,至於範例可以直接套用以前的即可,在此就不再覆述了,但是要記得必須多傳入一個參數 determinant,以免發生run time error。
Public Sub MIMPD(m() As Single, Determinant As Single, ReturnValue() As Single) Dim i As Long, j As Long, k As Long, n As Long Dim r() As Long, c() As Long, row As Long, temp() As Single Dim Pivot As Single, NoCompare As Boolean, order As Long Determinant = 1 row = UBound(m, 1) If row <> UBound(m, 2) Then MsgBox "矩陣輸入有誤": Exit Sub ReDim r(1 To row), c(1 To row), temp(1 To row), ReturnValue(1 To row, 1 To row) For i = 1 To row ReturnValue(i, i) = 1 Next For i = 1 To row Pivot = 0 NoCompare = False For j = 1 To row For n = 1 To i - 1 NoCompare = (j = c(n)) If NoCompare Then Exit For Next n If Not NoCompare Then For k = 1 To row For n = 1 To i - 1 NoCompare = (k = r(n)) If NoCompare Then Exit For Next n If Not NoCompare Then If Abs(m(k, j)) >= Pivot Then Pivot = Abs(m(k, j)) r(i) = k: c(i) = j End If End If Next k End If Next j Pivot = m(r(i), c(i)) If Pivot = 0 Then Determinant = 0: Exit Sub Else Determinant = Determinant * Pivot If Pivot <> 1 Then For k = 1 To row m(r(i), k) = m(r(i), k) / Pivot ReturnValue(r(i), k) = ReturnValue(r(i), k) / Pivot Next k End If For j = 1 To row Pivot = m(j, c(i)) If j <> r(i) And Pivot <> 0 Then For k = 1 To row m(j, k) = m(j, k) - m(r(i), k) * Pivot ReturnValue(j, k) = ReturnValue(j, k) - ReturnValue(r(i), k) * Pivot Next End If Next j Next i For i = 1 To row - 1 If r(i) <> c(i) Then order = order + 1 For j = 1 To row temp(j) = ReturnValue(r(i), j) ReturnValue(r(i), j) = ReturnValue(c(i), j) ReturnValue(c(i), j) = temp(j) Next For j = i + 1 To row If r(j) = c(i) Then r(j) = r(i): Exit For Next r(i) = c(i) End If Next Determinant = Determinant * (-1) ^ order End Sub
[ 上一個 |
首頁 | 數值分析 | 下一個 ] This page was written by Jaric on May. 9, 1999. All rights reserved.Total pageview since 4/6/1999.