espero que te sirva leelo !/*
Calculo de la Iversa de una Matriz - Algoritmo de Gauss
*/
#include <iostream.h>
class matriz {
      /*
         Definicion del objeto matriz. Usare tabla para guardar los datos orginales
         y sobre tabla2 se realizaran las operaciones.
      */
      double **tabla,**tabla2;
      int dim;
   public:
      enum tipo_tabla{coef,ampliada,inversa};
      matriz(int);
      ~matriz();
      void llenar();
      void imprimir(int);
      bool invertir(int,bool);
};
matriz::matriz(int n) {
   int i;
   dim=n;
   tabla=new double *[dim];
   for (i=0;i<dim;i++) *(tabla+i)=new double[dim*2];
}
matriz::~matriz() {
   int i;
   for (i=0;i<dim;i++) delete [] *(tabla+i);
   delete [] tabla;
   for (i=0;i<dim;i++) delete [] *(tabla2+i);
   delete [] tabla2;
}
void matriz::llenar() {
   int i,j;
   double num;
   for (i=0;i<dim;i++) {
      for (j=0;j<dim;j++) {
         cout<<"Ingresa coeficiente a["<<i+1<<","<<j+1<<"]: ";
         cin>>num;
         *(*(tabla+i)+j)=num;
      }
      for (j=dim;j<dim*2;j++) *(*(tabla+i)+j)=(i==(j-dim))?(double)1:(double)0;
   }
   tabla2=new double *[dim];
   for (i=0;i<dim;i++) *(tabla2+i)=new double[dim*2];
   for (i=0;i<dim;i++)
      for (j=0;j<dim*2;j++) *(*(tabla2+i)+j)=*(*(tabla+i)+j);
}
void matriz::imprimir(int t_tabla) {
   int i,j;
   if (t_tabla==coef) {
      for (i=0;i<dim;i++,cout<<endl)
         for (j=0;j<dim;j++) cout<<*(*(tabla+i)+j)<<"t";
   }
   else if (t_tabla==ampliada) {
      for (i=0;i<dim;i++,cout<<endl)
         for (j=0;j<dim*2;j++) cout<<*(*(tabla+i)+j)<<"t";
   }
   else {
      for (i=0;i<dim;i++,cout<<endl)
         for (j=dim;j<dim*2;j++) cout<<*(*(tabla2+i)+j)<<"t";
   }
}
bool matriz::invertir(int pivote=0,bool ida=true) {
   /*
      Invierte la matriz en tabla2. Retorna true si el proceso se realizo con exito, o sea
      si la matriz en tabla es invertible o de lo contrario false.
      Pivote es el elemento de la diagonal bajo, o sobre, el cual se anularan los coeficientes.
      ida indica que paso se ejecuta, la formacion de:
         i) triangular superior
         ii) triangular inferior y simplificacion
      Vea las hojas de respuesta para ver una explicacion detallada de los pasos y el algoritmo
   */
   int i,j;
   double k;
   if (!*(*(tabla2+pivote)+pivote)) return false; // Matriz no invertible
   else if (ida) {
      // Fomacion trinagular superior
      if (pivote==dim-1) return invertir(pivote,false); //Se llega al elemento a[n,n] y se llama a si misma pero con false, o sea pasa al paso ii
      else {
         for (i=pivote;i<dim-1;i++) {
            k=*(*(tabla2+i+1)+pivote)/ *(*(tabla2+pivote)+pivote); // Calculo de k
            for (j=0;j<dim*2;j++)
               *(*(tabla2+i+1)+j)=*(*(tabla2+i+1)+j)-*(*(tabla2+pivote)+j)*k; // Operacion fila
         }
         return invertir(++pivote);
      }
   }
   else {
      // Fomacion trinagular inferior
      if (pivote==0) { //Se llega al elemento a[1,1]
         k=1/ *(*(tabla2+pivote)+pivote);
         for (j=0;j<dim*2;j++)
            *(*(tabla2+pivote)+j)*=k; //Se simplifica el elemento la fila por el elemento de la diagonal (paso iii)
         return true;
      }
      else {
         for (i=pivote;i>0;i--) {
            k=*(*(tabla2+i-1)+pivote)/ *(*(tabla2+pivote)+pivote); // Calculo de k
            for (j=0;j<dim*2;j++)
               *(*(tabla2+i-1)+j)=*(*(tabla2+i-1)+j)-*(*(tabla2+pivote)+j)*k; // Operacion fila
            k=1/ *(*(tabla2+pivote)+pivote);
            for (j=0;j<dim*2;j++)
               *(*(tabla2+pivote)+j)*=k; //Se simplifica el elemento la fila por el elemento de la diagonal (paso iii)
         }
         return invertir(--pivote,false);
      }
   }
}
int main() {
   int dim;
   matriz *tabla;
   cout<<"Calculo de la Iversa de una Matriz - Algoritmo de Gauss"<<endl<<endl;
   cout<<"Fase de Tarea Certamen 2 - Fundamentos de Informatica I"<<endl<<endl;
   cout<<"Jorge Riquelme S. 2173090-4"<<endl;
   cout<<"http://www.totex.cl - 
totex@totex.cl"<<endl<<endl<<endl;
   cout<<"Dimension de la matriz? ";
   cin>>dim;
   tabla=new matriz(dim);
   tabla->llenar();
   cout<<endl<<"Matriz de coeficientes ingresados:"<<endl;
   tabla->imprimir(matriz::coef);
   cout<<endl<<"Matriz ampliada"<<endl;
   tabla->imprimir(matriz::ampliada);
   if (tabla->invertir()) {
      // Si la matriz se pudo invertir la muestra
      cout<<endl<<"Matriz Inversa"<<endl;
      tabla->imprimir(matriz::inversa);
   }
   else cout<<endl<<"La matriz no tiene inversa!"<<endl;
   return 0;
}