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