|
|
◆ Zhetri()
| Sub Zhetri |
( |
Uplo As |
String, |
|
|
N As |
Long, |
|
|
A() As |
Complex, |
|
|
IPiv() As |
Long, |
|
|
Info As |
Long |
|
) |
| |
行列の逆行列 (エルミート行列)
- 目的
- 本ルーチンはZhetrfにより計算された分解 A = U*D*U^H または A = L*D*L^H を用いて, エルミート行列Aの逆行列を求める.
- 引数
-
| [in] | Uplo | 分解形が上三角行列あるいは下三角行列のどちらで格納されているかを指定.
= "U": 上三角, 分解形は A = U*D*U^H.
= "L": 下三角, 分解形は A = L*D*L^H. |
| [in] | N | 行列Aの行および列数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る) |
| [in,out] | A() | 配列 A(LA1 - 1, LA2 - 1) (LA1 >= N, LA2 >= N)
[in] Zhetrfにより求められたUまたはLを得るために使われるブロック対角行列Dおよび乗数.
[out] Info = 0の場合, 元の行列Aの(対称な)逆行列. Uploに従い, 逆行列の上あるいは下三角部分が出力され, A()の対角要素より下あるいは上の残りの部分は参照されない. |
| [in] | IPiv() | 配列 IPiv(LIPiv - 1) (LIPiv >= N)
Zhetrfにより求められた行および列の交換とDのブロック構造の情報. |
| [out] | Info | = 0: 正常終了.
= -1: パラメータ Uplo の誤り. (Uplo <> "U"および"L")
= -2: パラメータ N の誤り. (N < 0)
= -3: パラメータ A() の誤り.
= -4: パラメータ IPiv() の誤り.
= i > 0: Dのi番目の要素が0である. 行列は特異で, その逆行列を求めることはできなかった. |
- 出典
- LAPACK
- 使用例
- 行列 A の逆行列を求める. ただし,
( 0.20 -0.11+0.93i 0.81-0.37i )
A = ( -0.11-0.93i -0.32 -0.80+0.92i )
( 0.81+0.37i -0.80-0.92i -0.29 )
とする. Sub Ex_Zhetri()
Const N = 3
Dim A(N - 1, N - 1) As Complex, IPiv(N - 1) As Long, Info As Long
A(1, 0) = Cmplx(-0.11, -0.93): A(1, 1) = Cmplx(-0.32, 0)
A(2, 0) = Cmplx(0.81, 0.37): A(2, 1) = Cmplx(-0.8, -0.92): A(2, 2) = Cmplx(-0.29, 0)
Call Zhetrf("L", N, A(), IPiv(), Info)
If Info = 0 Then Call Zhetri("L", N, A(), IPiv(), Info)
Debug.Print "Inv(A) ="
Debug.Print "Info =", Info
End Sub
Function Cmplx(R As Double, Optional I As Double=0) As Complex 複素数の作成
Function Cimag(A As Complex) As Double 複素数の虚数部
Function Creal(A As Complex) As Double 複素数の実数部
Sub Zhetrf(Uplo As String, N As Long, A() As Complex, IPiv() As Long, Info As Long) 係数行列のUDUHまたはLDLH分解 (エルミート行列)
Sub Zhetri(Uplo As String, N As Long, A() As Complex, IPiv() As Long, Info As Long) 行列の逆行列 (エルミート行列)
- 実行結果
Inv(A) =
3.5853396244861 0 0 0
0 0
2.62494404338631 -0.461802857775011 2.18938290789155 0
0 0
1.30796976541958 -2.47907094012256 0.702866522251437 -2.3066988427915
2.42092751624671 0
Info = 0
|