Inv

通过乔丹-高斯(Jordan-Gauss)方法计算平方可逆矩阵的乘法逆。

matrix matrix::Inv()

返回值

矩阵的乘法逆。

 

注意

原始矩阵和逆矩阵的乘积就是单位矩阵。

如果至少一个矩阵行或列为零,则无法获得逆矩阵。

如果两个或多个矩阵行或列线性依赖,则无法获得逆矩阵。

举例

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;

         //--- 必须沿着对角线填充一

         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);

  }