Determinante de una matriz NxN con C++

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: akodo, maiku

Responder
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Determinante de una matriz NxN con C++

Mensaje por cerenkov » Vie Jul 02, 2010 3:23 am

El cálculo del determinante de una matriz cuadrada NxN permite saber si esta es invertible. Si es cero no tiene inversa y entonces podemos programar una excepción para no ejecutar el código para el cálculo de la inversa.

A continuación presentamos el código para el cálculo del determinante de cualquier matriz NxN. En lugar de introducir los datos manualmente por pantalla se van a leer desde un archivo externo (datos.in) que vamos a colocar en la carpeta datos y esta, a su vez, en una carpeta que vamos a llamar DETERMINANTE. El archivo datos.in contendrá lo siguiente:

Código: Seleccionar todo

3

1 2 3
2 1 4
3 4 1
El primer valor es el orden de la matrix (3x3 en este caso) y a continuación se tienen todos los elementos de una matriz simétrica.

Para calcular el determinante de una matriz NxN colocamos el siguiente código:

Código: Seleccionar todo

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

void invermat(int n, double **a, double &determ);

int main() {

    system ("clear");

    ifstream label1 ("datos//datos.in"); // Abre el archivo de entrada de datos

    // Definición de variables y asignación dinámica de memoria    

    int i, j, n;

        label1 >> n;

    double **a, determ = 0;

    a = new double* [n];

    for(j=0; j<n; j++){

        a[j] = new double [n];
    
    }    

    // Lectura de la matriz (label1 apunta a datos.in en el subdirectorio datos del home de usuario)

        for(i=0; i<n; i++){

                for(j=0; j<n; j++){

                         label1 >> a[i][j];
                }

    }

    cout << "Imprime la matriz de origen\n\n";

    // Matriz de origen; a

    for(i=0; i<n; i++){

                for(j=0; j<n; j++){

                         cout <<  a[i][j] << " ";
                }

    cout << endl;

        }

    cout << endl;

    invermat (n, a, determ);

    cout << "El determinante de la matriz anterior es = " << determ << "\n\n";

    delete a;

    return 0;

}

void invermat(int n, double **a, double &determ) {

// Algoritmo para la eliminación simple de Gauss

    int i, j, k;

    double factor;

    double **L, *D, *X;
 
    X = new double [n]; D = new double [n];

    L = new double* [n];
  
    for (j = 0; j < n; j++)

        L[j] = new double [n];

    for (k = 0; k < n - 1; k++) {
     
        for (i = k+1; i < n;  i++) {

            factor = a[i][k]/a[k][k];

            for (j = k+1; j < n + 1; j++) {

                a[i][j] = a[i][j] - factor * a[k][j];

            }
   

        }

    }

// Cálculo del determinante

    determ = 1.;

    for (i = 0; i < n; i++) {

        determ = determ * a[i][i];

    }

    delete L, D, X;

}
que implementa la eliminación simple de Gauss para producir una matriz triangular antes del cálculo del determinante (pasado por referencia desde la función invermat). Este código se graba como determ.c++ dentro de la carpeta DETERMINANTE. Para compilarlo, en una cónsola nos dirigimos a la carpeta DETERMINANTE y ejecutamos:

g++ determ.c++ -o determ

Para correr el programa:

./determ

La salida es:

Código: Seleccionar todo

Imprime la matriz de origen

1 2 3
2 1 4
3 4 1

El determinante de la matriz anterior es = 20
Si queremos calcular otro determinante pero para esta matriz:

Código: Seleccionar todo

1 2 3 4
2 1 5 6
3 5 1 7
4 6 7 1
modificamos el datos.in y ejecutamos con ./determ para obtener:

Código: Seleccionar todo

Imprime la matriz de origen

1 2 3 4
2 1 5 6
3 5 1 7
4 6 7 1

El determinante de la matriz anterior es = -258
Para verificar que el código funciona bien, se puede probar con lenguaje R. Esta es la salida en una cónsola de mi sistema con los comandos empleados:

Código: Seleccionar todo

> w<-matrix(data=0,4,4)
> data.entry(w)
> w
     var1 var2 var3 var4
[1,]    1    2    3    4
[2,]    2    1    5    6
[3,]    3    5    1    7
[4,]    4    6    7    1
> det(w)
[1] -258
El resultado es idéntico al que produce mi código C++.

Editado -- Jue Jul 01, 2010 8:53 pm --

Archivo zip con código fuente y el ejecutable:

DETERMINANTE.zip
Responder
  • Similar Topics
    Respuestas
    Vistas
    Último mensaje