• Welcome to Test Foro de elhacker.net SMF 2.1.
 

Calcular determinante de una matriz NxN

Started by amchacon, 12 February 2013, 21:39 PM

0 Members and 1 Guest are viewing this topic.

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 :)

Code (cpp) Select
#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

Quote from: amchacon on 12 February 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):

Code (cpp) Select
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
;-) ;-) ;-)