Continua a non funzionare con "TUTTE" le matrici quadrate
se utilizzo questa matrice:
-2 2 -3
-1 1 3
2 0 -1

Il programma va in tilt e si riempie di nan e inf...
il mio codice è scritto sotto... è 3 giorni che lo scrivo (sono un neofita) e confido molto in voi

codice:
#include<iostream>
#include<math.h>
#include<cstdlib>
using namespace std;

// Alloco la memoria per una matrice di ordine "o" e la inizializzo
int funz1()
{   
int o;
cout << "Dammi l'ordine della tua matrice: ";
cin >> o;
double **M;
M= new double*[o];
for(int i = 0; i < o; i++)
   {
    M[i] = new double[o];       
    };
double val;
for(int k=0; k<o ; k++)
    {
       for(int l=0; l<o; l++)
       {
       cout << "Riga " << k+1 << " Colonna " << l+1 << ": " ;
       cin >> val;
       M[k][l]=val;
       };
    };
cout << "\nLa tua matrice è:\n" << endl;
for(int i=0; i<o; i++)
{ 
     for(int j=0; j<o; j++) 
     {
      cout << M[i][j] << "	";
     } 
cout << "\n" << endl;
}

//Alloco la memoria per una nuova matrice con lo stesso numero di righe ma doppio numero di colonne ( |A||I| )

double **m;
m= new double*[o];
for(int i=0; i<2*o; i++)
{
m[i]= new double[2*o];
}

for(int i=0; i<o; i++)
{
 for (int k=0; k<o; k++)
  {
  m[i][k]=M[i][k];
  }
}

for(int i=0; i<o; i++)
{
     for(int k=o; k<(2*o); k++)
     {
     if(i==(k-o)){m[i][k]=1;}
     else{m[i][k]=0;}
     };
}
cout << "Affianco la matrice identità:\n" << endl;
for(int i=0; i<o; i++)
{
   for(int k=0; k<2*o; k++)
   {
   cout << m[i][k] << "	";
   }
cout << "\n" << endl;
}

//Cominciano le operazioni di calcolo per la matrice inversa

double *tmp; 
tmp=new double[2*o];
for(int j=0;j<o-1;j++)
{
      for(int i=j+1;i<o;i++)
      {  
      if(m[i][j]!=0) 
      {
      double mol=m[i][j]/m[j][j];
      for(int k=0;k<2*o;k++)
      {
      tmp[k]=mol*m[j][k];
      };
      for(int k=0;k<2*o;k++) 
      {
      m[i][k]-=tmp[k];
      };
      }
      if(m[i][i]==0)
      {
      double *tmp2;
      double *tmp3;
      tmp2= new double[2*o];
      tmp3= new double[2*o];
      for(int k=0; k<2*o; k++) {tmp2[k]=m[i][k]; tmp3[k]=m[i+1][k];}
      for(int k=0; k<2*o; k++) {m[i][k]=tmp3[k]; m[i+1][k]=tmp2[k];}
      }
      }
}

cout << "Faccio l'eliminazione di Gauss sotto la diagonale:\n" << endl;
for(int i=0; i<o; i++)
{
   for(int k=0; k<2*o; k++)
   {
   cout << m[i][k] << "	";
   };
cout << "\n" << endl;
};

for(int j=o-1;j>0;j--)
{  
    for(int i=j-1;i>=0;i--)
      {
         if(m[i][j]!=0) 
        {
        double mol=m[i][j]/m[j][j];
        for(int k=0;k<2*o;k++) {tmp[k]=mol*m[j][k];};
        for(int k=0;k<2*o;k++) {m[i][k]-=tmp[k];};
        }
      };
};

//Controllo del determinante
double d=m[0][0];
for(int i=0; i<o; i++)
{d=d*m[i][i];}
cout << "il determinante è: " << d << "\n" << endl;
if(d=0){cout << " il determinante è 0. Non è possibile calcolare l'inversa di questa matrice ! " << endl; exit(0);}

cout << "Faccio l'eliminazione di Gauss sopra la diagonale:\n " << endl;
for(int i=0; i<o; i++)
{
   for(int k=0; k<2*o; k++)
   {
   cout << m[i][k] << "	";
   };
cout << "\n" << endl;
};

for(int i=0;i<o;i++)
{
    if(m[i][i]!=1) 
    {
    double mol=m[i][i];
      for(int k=0;k<2*o;k++)
      {
      m[i][k]=m[i][k]/mol;
      };
    }
};

cout << "Divido per i pivots:\n" << endl;
for(int i=0; i<o; i++)
{
   for(int k=0; k<2*o; k++)
   {
   cout << m[i][k] << "	";
   };
cout << "\n" << endl;
};

} 

int main()
{
cout << "Benvenuto in MatrixInverter" << endl;
funz1();
}
Come potete vedere subito dopo il commento //cominciano le operazioni di calcolo della matrice inversa
li sto cercando di fare una eliminazione di gauss che mi permetta anche di scambiare la riga con quella sotto nel caso in cui un pivot diventi 0... una volta compilato ed eseguito si presentano 2 problemi eseguendo la matrice sopra scritta:
1) mi si riempie di nan e inf vari come se avesse utilizzato uno 0 per le proprie operazioni (e non capisco a quale 0 possa poggiarsi.
2) le righe vengono invertite ma ovviamente quella sotto che viene portata su "aggira" il for e non viene ridotta dalle mosse di gauss

come posso cavarci fuori qualcosa ? premetto che ci ho pensato molto ma non giungo a conclusioni esaudienti