Inv

Calcula una matriz inversa multiplicativa con respecto a una matriz cuadrada no degenerada utilizando el método de Jordaan-Gauss.

matrix matrix::Inv()

Valor retornado

Matriz inversa multiplicativa.

Observación

El producto de la matriz origen y una matriz inversa será una matriz unitaria.

Si al menos una fila (columna) de una matriz es cero, no se podrá obtener la matriz inversa.

Si dos (o más) filas (columnas) de una matriz son linealmente dependientes, no se podrá obtener la matriz inversa.

 

Ejemplo:

int TestInverse(const int size_m)
  {
   int    i,j,errors=0;
   matrix matrix_a(size_m,size_m);
//--- rellenamos la matriz cuadrada
   MatrixTestFirst(matrix_a);
//--- mediremos los milisegundos
   ulong t1=GetMicrosecondCount();
//--- obtenemos la matriz inversa
   matrix inverse=matrix_a.Inv();
//--- medimos
   ulong t2=GetMicrosecondCount();
//--- comprobamos que sea correcto
   matrix identity=matrix_a.MatMul(inverse);
//---
   for(i=0i<size_mi++)
     {
      for(j=0j<size_mj++)
        {
         double value;
         //--- en la diagonal deberá haber unidades
         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);
               //--- muchas multiplicaciones y divisiones, por eso reducimos la precisión de la comprobación
               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);
  }