Calcular determinante de una matriz NxN

Iniciado por amchacon, 12 Febrero 2013, 21:39 PM

0 Miembros y 1 Visitante están viendo este tema.

amchacon

Os dejo aquí un programa que me creé para calcular determinantes de matrices NxN. Personalmente no me gustan los algoritmos recursivos, pero funcionan de maravilla en este caso :)

Código (cpp) [Seleccionar]
#include <cstdlib>
#include <iostream>

using namespace std;

void MostrarMatriz(int** Matriz,unsigned int MAX);
void Leer_matriz(int** a,unsigned int MAX);
int CalcularDeterminante(int** Matriz,unsigned int MAX);

int main(int argc, char *argv[])
{
   int Tamanyo;

   while(1)
   {
       cout<<"Indica el tamanyo de la matriz: ";
       cin>>Tamanyo;

       if (Tamanyo < 2)
           Tamanyo = 2;

       cout<<endl<<"Inserta los elementos de la matriz: "<<endl<<endl;

       int** Matriz;
       Matriz = new int*[Tamanyo];

       for (int i = 0; i<Tamanyo; i++)
           Matriz[i] = new int[Tamanyo];

       Leer_matriz(Matriz,Tamanyo);
       cout<<endl<<endl<<endl;
       MostrarMatriz(Matriz,Tamanyo);
       cout<<endl<<endl<<endl;
       cout<<"El determinante es: "<<CalcularDeterminante(Matriz,Tamanyo);
       cout<<endl<<endl<<endl;
       system("PAUSE");
       system("PAUSE");
       system("CLS");
   }
   return EXIT_SUCCESS;
}

int CalcularDeterminante(int** Matriz,unsigned int MAX)
{

   if (MAX == 2)
   {
       return (Matriz[0][0]*Matriz[1][1] - Matriz[0][1]*Matriz[1][0]);
   }
   else
   {
       int Actual = 0;
       int k = 0;
       int Numero = 0;
       short Multriplicador;
       int** Buffer; // Creo una nueva matriz para hacer los adjuntos
       Buffer = new int*[MAX-1];

       for (int i = 0; i<(MAX-1); i++)
           Buffer[i] = new int[MAX-1];

       for (int l = 0; l < MAX; l++) // Desarrollo por filas
       {
           for (int j = 1; j < MAX; j++) // Creo una nueva matriz adjunta
           {
               for (int i = 0; i < MAX; i++)
               {
                   if (i != l)
                   {
                       Buffer[k][j-1] = Matriz[i][j];
                       k++;
                   }
               }
               k = 0;
           }

           if ( l % 2 != 0)
               Multriplicador = -1;
           else
               Multriplicador = 1;
           Numero += (Matriz[l][0]*CalcularDeterminante(Buffer,MAX-1)*Multriplicador);
       }
       return Numero;
   }
}

void MostrarMatriz(int** Matriz,unsigned int MAX)
{
   for (int j = 0; j < MAX; j++)
   {
       cout<<endl<<" (  ";
       for (int i = 0; i < MAX; i++)
           cout<<Matriz[i][j]<<"  ";


       cout<<") ";
   }
}

void Leer_matriz(int** a,unsigned int MAX)
{
   int i,j;

   for (j = 0; j < MAX; j++)
       for (i = 0; i < MAX; i++)
       {
           cout<<"Introduce el numero para la posicion ("<<i<<","<<j<<") "<<endl;
           cin>>a[i][j];
       }
}



Consejos, mejoras ;)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

Cita de: amchacon en 12 Febrero 2013, 21:39 PM
Os dejo aquí un programa que me creé para calcular determinantes de matrices NxN. Personalmente no me gustan los algoritmos recursivos, pero funcionan de maravilla en este caso :)


Consejos, mejoras ;)

Y tanto que funciona bien ¡ ¡ ¡

Sólo unas pequeñas observaciones:

* Si el tamaño es 1 el determinante es el número y en tu código lo transformas automáticamente en un determinante de 2x2.

* Cambiaría, para que no resulte "espesa" la entrada de datos y que los índices sean "matemáticos" (no se suele usar en cálculo (0,0) sino (1,1) para la primera posición):

Código (cpp) [Seleccionar]
void Leer_matriz(int** a,unsigned int MAX)
{
    int i,j;
    cout<<"Introduce el numero para la posicion: "<<endl;
    for (j = 0; j < MAX; j++)
        for (i = 0; i < MAX; i++)
        {
            cout<<" ("<<i+1<<","<<j+1<<") = ";
            cin>>a[i][j];
        }
}


Como ves, chorradas al fin y al cabo.

Saluditos!.

P.D:Y gracias por compartir
;-) ;-) ;-)