名称 | ・・・・・・・ |
マトリックスの逆行列(Gauss-Jordan法) |
|||
ルーチン名 | ・・・・・・・ |
InvMat |
|||
スクリプトNo | ・・・・・・・ | sub_set02- 008 | |||
file名 | ・・・・・・・ | ScriptSet02.lzh sub_set02のページからセットごとダウンロードしてください。 |
|||
概略 | ・・・・・・・ |
Gauss-Jordan法を利用して、与えられたマトリックスの逆マトリックスを計算して戻す |
|||
|
|||||
使用前提 | ・・・・・・・ |
戻り値を受け取る通常のバリアント変数(配列では無く)を宣言して用意しておく。 |
|||
依存関係 | ・・・・・・・ |
特になし |
|||
引数説明 | ・・・・・・・ |
orgMat |
:(in)元のマトリックス [mat(3,3)]形式 |
||
戻り値説明 | ・・・・・・・ |
4行4列の逆変換マトリックス[mat(3,3)]形式 |
|||
変数説明 | ・・・・・・・ |
B(),A() |
:GaussJordan法で使用する一時マトリックス |
||
注意点 | ・・・・・・・ |
引数の形式[mat(3,3)]を間違わないように。 |
|||
スクリプト | |||||
'---マトリックスの逆行列をもとめる。(Gauss-Jordan法) Function InvMat(orgMat) '与えられたマトリックスの逆マトリックスを計算、取得する '戻値--4行4列の逆変換マトリックス[mat(3,3)]形式 '引数-- ' orgMat :(in)元のマトリックス dim B(),A() ':GaussJordan法で使用する一時マトリックス dim M,Q,P ':GausJordan法で使用する一時変数 dim Dummy,Max,s ':選択用に使う一時変数 dim i,j,k ':カウンタ用変数 M=4 'Shadeでは4次の行列なので固定。変更すればn次の計算も可 if UBound(orgMat,1)<>(M-1) or UBound(orgMat,2)<>(M-1) then invMat=false exit function '引数で渡された配列の次数が違うとき処理中止 end if redim B(M-1,M-1) redim A(M-1,2*M-1) For i=0 To M-1 A(i,M+i)=1 for j=0 to M-1 A(i,j)=orgMat(i,j) next Next 'Gauss-Jordan(PivotSelection) For K = 0 To M-1 '--Selection Area max=0 s=k for j=k to M-1 if abs(A(j,k))>Max then Max=abs(A(j,k)) s=j end if next if Max=0 then invMat=false '逆行列は存在しないので処理中止 exit function else for j=0 to 2*M-1 Dummy=A(k,j) A(k,j)=A(s,j) A(s,j)=Dummy next end if P = A(K, K) For j=k To 2*M-1 A(k,j)=A(k,j)/P Next For i=0 To M-1 If i<>k Then Q=A(i,k) For j=1 To 2*M-1 A(i,j) = A(i,j) - Q*A(k,j) Next end if Next Next 'Inverse Matrix For i=0 To M-1 For j=0 To M-1 B(i, j)=A(i, j + M) Next Next invMat=B End Function |
|||||
使用例 | |||||
|