sub_set02へ戻る

名称 ・・・・・・・

マトリックスの逆行列(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()
M,Q,P
Dummy,Max,s
i,j,k

: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
使用例

'逆マトリックスで復帰テスト '■このテストは適当な線形状をパートに入れ、パートに何らかの変形 'を加えた上で実行してください。(計算誤差あり。) dim mat0 dim inv0 mat0=GetTransMat() inv0=invMat(mat0) mat0=transMat(mat0,inv0) applyTransMat(mat0)

sub_set02へ戻る