Inv

Jordan-Gauss 방법으로 정사각형 가역 행렬의 곱셈 역행렬을 계산합니다.

matrix matrix::Inv()

반환값

Multiplicative inverse of the matrix.

참조

원래 행렬과 역행렬의 곱은 항등 행렬입니다.

적어도 하나의 행렬 행 또는 열이 0이면 역행렬을 얻을 수 없습니다.

둘 이상의 행렬 행 또는 열이 선형 종속인 경우 역행렬을 얻을 수 없습니다.

 

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=0i<size_mi++)
     {
      for(j=0j<size_mj++)
        {
         double value;
//--- 대각선을 따라야 합니다.
         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);
  }