Inv

ジョーダン・ガウス法により正方可逆行列の乗法逆行列を計算します

matrix matrix::Inv()

戻り値

行列の乗法逆

注意事項

元の行列と逆行列の積が恒等行列です。

行列の行または列の少なくとも1つがゼロの場合、逆行列は取得できません。

2つ以上の行列の行または列が線形従属である場合、逆行列は取得できません。

 

int TestInverse(const int size_m)
 {
  int   i,j,errors=0;
  matrix matrix_a(size_m,size_m);
//--- 正方行列に書き込む
  MatrixTestFirst(matrix_a);
//--- マイクロ秒が測定される
  ulong t1=GetMicrosecondCount();
//--- 逆行列を取得する
  matrix inverse=matrix_a.Inv();
//--- 測定する
  ulong t2=GetMicrosecondCount();
//--- 正しさを確認する
  matrix identity=matrix_a.MatMul(inverse);
//---
  for(i=0; i<size_m; i++)
    {
    for(j=0; j<size_m; j++)
       {
        double value;
        //--- 1は対角線に沿っている必要がある
        if(i==j)
          value=1.0;
        else
          value=0.0;
        if(MathClassify(identity[i][j])>FP_ZERO)
          errors++;
        else
          {
          if(identity[i][j]!=value)
             {
              double diff=MathAbs(identity[i][j]-value);
              //--- 掛け算と割り算が多すぎるので、チェックの精度を下げる
              if(diff>1e-9)
                errors++;
             }
          }
       }
    }
//---
  double elapsed_time=double(t2-t1)/1000.0;
  printf("Inversion of matrix %d x %d  %s  errors=%d  time=%.3f ms",size_m,size_m,errors==0?"passed":"failed",errors,elapsed_time);
  return(errors);
 }