Inv

Calcula uma matriz inversa multiplicativa em relação a uma matriz quadrada não degenerada usando o método Gauss-Jordan.

matrix matrix::Inv()

Valor retornado

Matriz inversa multiplicativa.

Observação

O produto da matriz inicial e da matriz inversa é a matriz identidade.

Se pelo menos uma linha (coluna) da matriz for zero, a matriz inversa não pode ser obtida.

Se duas (ou mais) linhas (colunas) de uma matriz são linearmente dependentes, então a matriz inversa não pode ser obtida.

 

Exemplo:

int TestInverse(const int size_m)
  {
   int    i,j,errors=0;
   matrix matrix_a(size_m,size_m);
//--- preenchemos a matriz quadrada
   MatrixTestFirst(matrix_a);
//--- medimos microssegundos
   ulong t1=GetMicrosecondCount();
//--- obtemos uma matriz inversa
   matrix inverse=matrix_a.Inv();
//--- medimos
   ulong t2=GetMicrosecondCount();
//--- verificamos se está correto
   matrix identity=matrix_a.MatMul(inverse);
//---
   for(i=0i<size_mi++)
     {
      for(j=0j<size_mj++)
        {
         double value;
         //--- diagonal principal deve conter o valor um
         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);
               //--- muitas multiplicações e divisões, por isso reduzimos a precisão da verificação
               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);
  }