Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: amchacon en 12 Febrero 2013, 21:39 PM

Título: Calcular determinante de una matriz NxN
Publicado por: 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 :)

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 ;)
Título: Re: Calcular determinante de una matriz NxN
Publicado por: leosansan en 13 Febrero 2013, 20:35 PM
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
;-) ;-) ;-)