Inv

Вычисляет мультипликативную обратную матрицу по отношению к квадратной невырожденной матрице методом Жордана-Гаусса.

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