domingo, 7 de abril de 2013

Determinante matriz en C/C++

Cálculo del determinante en C/C++ mediante el uso de una función recursiva que se basa en el desarrollo de Laplace. Esta regla permite reducir el cálculo del determinante, al cálculo de sumas y productos. Este método no es ni mucho menos el más eficiente, debido a la función recursiva. Existen otros métodos, basados en la ortogonalización de matrices (Método de Gram-Smith (En Pascal)) que permiten el cálculo numérico de una manera mucho más eficiente para el ordenador.

Este programa ya fue implementado en Pascal, y ahora se ha implementado en C/C++. La limitación de este programa usando una función recursiva es evidente, y únicamente puede llegar a procesar matrices de 20x20.



/*CÁLCULA EL DETERMINANTE DE UNA MATRIZ EN C/C++*/

#include <stdio.h>

int const max=11;
int vis;
float M[max+1][max+1]; /*EN LA POSICION 0,0 SE GUARDA LA DIMENSION DE M*/
float Det;

float Determinante(float Mat[][max+1]);

int main(void)
{
    printf("\n\n  CALCULO DEL DETERMINANTE DE UNA MATRIZ POR RECURSIVIDAD");
    printf("\n\n                CYPASCAL.BLOGSPOT.COM\n\n\n\n");
    int cont1, cont2;
    printf("Introduce el tamano de la matriz: "); scanf("%f", &M[0][0]);
    for (cont1=1;cont1<=M[0][0];cont1++)
    for (cont2=1;cont2<=M[0][0];cont2++){
        printf("(%2i,%2i)  ", cont1,cont2); 
        scanf("%f",&M[cont1][cont2]);
    }
    printf("Tamano: %f \n La matriz introducida es: \n",M[0][0]);
    for (cont1=1;cont1<=M[0][0];cont1++){
        for (cont2=1;cont2<=M[0][0];cont2++)
            printf(" %5f", M[cont1][cont2]);
        printf("\n");
    }
    printf("Visualizar matrices intermedias? (1=SI, 0=NO): ");scanf("%i",&vis);
    Det=Determinante(M);
    printf("El determiante de M vale: %f",Det);
    scanf("%f",&Det);
    return 0;
}

float Determinante(float Mat[][max+1])
{
      float aux1,aux2,Maux[max+1][max+1];
      int cont1, cont2, cont3, cont4, cont5;
      if (Mat[0][0]==1)
         return (Mat[1][1]);
      else
      {
          aux1=0;
          aux2=1;
          for (cont1=1; cont1<=Mat[0][0];cont1++)
          {
              Maux[0][0]=Mat[0][0]-1;
      
              for (cont2=1;cont2<=Mat[0][0];cont2++)
              for (cont3=1;cont3<=Maux[0][0];cont3++){
                  if (cont2<cont1) 
                     Maux[cont2][cont3]=Mat[cont2][cont3+1];
                  else if (cont2>cont1) 
                     Maux[cont2-1][cont3]=Mat[cont2][cont3+1];
              }
              /*ESTOS DOS "FOR" SON PARA GENERAR MATRIZ ADJUNTA*/
              if (vis==1){
                      printf("\n\n");
                      for (cont4=1;cont4<=Maux[0][0];cont4++){
                          for (cont5=1;cont5<=Maux[0][0];cont5++)
                              printf(" %5f", Maux[cont4][cont5]);
                          printf("\n");
              }}/*SE IMPRIMEN EN PANTALLA LAS MATRICES INTERMEDIAS*/    
              aux1=aux1+Mat[cont1][1]*aux2*Determinante(Maux);
              aux2=aux2*(-1);/*ALTERNA 1 Y -1*/
          }
          return (aux1);
}}


Un saludo.

1 comentario:

  1. Como introduzco los valores de la matriz? 3x3... O 3,3? Para ejecutarlo?

    ResponderEliminar