/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Duda: ¿Determinante de una matriz?

 
      Índice del Foro elrincondelc.com -> Algoritmos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
DrPuertas



Registrado: 07 Oct 2011
Mensajes: 1
Ubicación: Gijón

MensajePublicado: 07/10/2011 12:42 pm
Título: Duda: ¿Determinante de una matriz?

Buenas tardes:

Es la primera vez que escribo en vuestro foro. Lo leo gracias a Google pero, hasta hoy no había participado.
Como podeis ver me he registrado recientemente, de modo que espero que entendais si he olvidado algún "paso" de protocolo Wink
Pues bien, el problema es que en la Universidad nos han dado un par de problemas. Entre ellos, uno bastante complicado que nos solicita operar por sobre dos matrices.
He podido realizar casi todo el programa, excepto que, por alguna razón que no logro comprender, el cálculo de la determinante de las matrices no funciona (Da un típico error de "Windows ha encontrado un problema...")

¿Por qué no funciona? Pues, no lo sé. La profesora me ha dicho que debo revisar la función del cálculo de la determinante.

Aquí está el programa en su totalidad.

Código:

#include <stdio.h>
#include <stdlib.h>

void menu(void);
int ingresarOpcion(void);
void cargaMatrices (int M[3][3], int T[3][3]);
void sumaMatrices (int Z[3][3], int X[3][3]);
void escalarMatrices (int E[3][3]);
void productoMatrices (int O[3][3], int P[3][3]);
void traspuestaMatrices (int H[3][3]);
int determinante(int V[3][3], int F[3][3]);     

main()
{
    int opcion,det,A[3][3], B[3][3], resp;
    opcion=1;
       
    while (opcion!=0)
    {
        opcion=ingresarOpcion();
        system("cls");
        switch (opcion)
        {
        case 1:
            cargaMatrices(A,B);
            break;
        case 2:
            sumaMatrices(A,B);
            break;
        case 3:
        printf ("Indique con que matriz desea trabajar: ");
        scanf ("%d",&resp);
            if (resp==1)
            escalarMatrices(A);
            else
            escalarMatrices(B);
            break;
        case 4:
            productoMatrices(A,B);
            break;           
        case 5:
             printf ("Indique con que matriz desea trabajar: ");
             scanf ("%d",&resp);
            if (resp==1)
            traspuestaMatrices(A);
            else
            traspuestaMatrices(B);
            break;                       
        case 6:
            printf ("Indique con que matriz desea trabajar: ");
            scanf ("%d",&resp);
            if (resp==1)
            escalarMatrices(A);
            else
            escalarMatrices(B);
            determinante(A,B);
            break;           
        }           
    }   
}

void menu(void)
{
    system("cls");
    system("color 0f");
    printf("\n\n\n\n\t\tOperaciones con Matrices de 3x3");
    printf("\n\t\t----------- --- -------- -- ---");
    printf("\n\n\t\t1- Cargar matrices");
    printf("\n\n\t\t2- Calcular la suma de las matrices");   
    printf("\n\n\t\t3- Calcular el producto de una matriz por un escalar");
    printf("\n\n\t\t4- Calcular el producto de las matrices");
    printf("\n\n\t\t5- Calcular la traspuesta de una de las matrices");
    printf("\n\n\t\t6- Calcular el determinante de una de las matrices");
    printf("\n\n\t\t0- Terminar");
    printf("\n\n\n\t\tIngrese su opci%cn: ", 162);   
   
}


int ingresarOpcion(void)
{
    int op;
    do
    {
        menu();
        scanf("%d", &op);
        fflush(stdin);
    }   
    while (op<0 || op>6);
    return op;
}

void cargaMatrices(int M[3][3], int T[3][3])//se deberá modificar en forma conveniente
{
int i,j;
       for (i=0;i<3;i++)
       {
           for (j=0;j<3;j++)
           {
               printf ("Ingrese elemento %d, %d: ", i,j);
               scanf ("%d",&M[i][j]);
               fflush (stdin);
           }
       }
       for (i=0;i<3;i++)
       {
           for (j=0;j<3;j++)
           {
                  printf ("Ingrese elemento %d %d",i, j);
                  scanf("%d", &T[i][j]);
                  fflush (stdin);
           }
       }
}
void sumaMatrices (int Z[3][3], int X[3][3])
{
     int i,j, C[3][3];
     for (i=0;i<3;i++)
     {
         for (j=0;j<3;j++)
         {
             C[i][j]=Z[i][j]+X[i][j];
         }
     }
     printf ("El resultado de la suma de la matriz es: \n");
            for (i=0;i<3;i++)
            {
                for (j=0;j<3;j++)
                {
                    printf ("%d \t ", C[i][j]);
                }
                printf ("\n");
            }
     system ("pause");
     
}
void escalarMatrices (int E[3][3])
{
     int i,j,L, U[3][3];
     printf ("Ingrese el valor escalar");
     scanf ("%d",&L);
     fflush (stdin);
            for (i=0;i<3;i++)
            {
                for (j=0;j<3;j++)
                {
                    U[i][j]=L*E[i][j];
                }
            }
            printf ("El resultado de la matriz por la escalar es:\n");
                   for (i=0;i<3;i++)
                   {
                       for (j=0;j<3;j++)
                       {
                           printf ("%d \t ", U[i][j]);
                       }
                       printf ("\n");
                   }
                   system ("pause");
}
void productoMatrices (int O[3][3], int P[3][3])
{
     int i,j,k, D[3][3];
         for (i=0;i<3;i++)
         {
             for (k=0;k<3;k++)
             {
                 D[i][k]=0;
                 for (j=0;j<3;j++)
                 {
                     D[i][k]+=O[i][j]*P[j][k];
             }
             }
         }
         printf ("El resultado del producto de matrices es:\n");
                for (i=0;i<3;i++)
                {
               
                    for (j=0;j<3;j++)
                    {
                        printf ("%3d \t ", D[i][j]);
                    }
                    printf ("\n");
                }
                 system ("pause");
}
void traspuestaMatrices (int H[3][3])
{
     int i, j, K[3][3];
     for (i=0;i<3;i++)
     {
         for (j=0;j<3;j++)
         {
             K[i][j]=H[j][i];
             printf ("\nTraspuesta de una matriz");
             printf ("%d \t", K[i][j]);
             }
             printf ("\n");
             }
             system ("pause");
}
int determinante(V[3][3], F[3][3])
{
    int i, j,r, r1,D;
    for (i=0;i<3;i++)
    {
        for (j=0;i<3;j++)
        {
            F[i][j]=V[i][j];
        }
        }
        for (i=0;i<3;i++)
        {
            for (j=0;i<3;j++)
            {
                F[3+1][j]=V[i][j];
            }
        }
        for (i=0;i<3;i++)
        {
            r=r+V[i][1]*V[i+1][2]*V[i+2][3];
        }
        for (i=0;i<3;i++)
        {
            r1=r1+V[i][3]*V[i+1][2]*V[i+2][1];
        }
        printf ("%d \t \n", D=r-r1);
        printf ("\n");
        system ("pause");
}





Y aquí está la sección en forma más específica que, supuestamente, es la que me causa el error

Código:

int determinante(V[3][3], F[3][3])
{
    int i, j,r, r1,D;
    for (i=0;i<3;i++)
    {
        for (j=0;i<3;j++)
        {
            F[i][j]=V[i][j];
        }
        }
        for (i=0;i<3;i++)
        {
            for (j=0;i<3;j++)
            {
                F[3+1][j]=V[i][j];
            }
        }
        for (i=0;i<3;i++)
        {
            r=r+V[i][1]*V[i+1][2]*V[i+2][3];
        }
        for (i=0;i<3;i++)
        {
            r1=r1+V[i][3]*V[i+1][2]*V[i+2][1];
        }
        printf ("%d \t \n", D=r-r1);
        printf ("\n");
        system ("pause");
}


¿Podeis darme una mano?
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7517
Ubicación: Mexico

MensajePublicado: 07/10/2011 5:37 pm
Título:

Revisando Wikipedia el determinante de una matriz de orden 3 se puede calcular directamente utilizando la formula indicada, ¿No te permiten utilizarla?

En cuanto al calculo del determinante sera mejor esperar a alguno de los usuarios mas capacitados en matematicas para que te de una opinion.

En cuanto al lenguaje C el problema principal se debe a los indices utilizados en la funcion. Hay que recordar que los indices validos de un array de N elementos son 0 (el primero) hasta N-1 (el ultimo), en tu caso el rango es [0, 2]

* En el segundo bucle for tienes:
Código:
F[3 + 1][j] = V[i][j];

Ahi se trata de acceder al elemento "F[3 + 1][j]", no es un indice valido.

* En la ultima iteracion del tercer bucle el valor del contador "i" sera 2 y en la sentencia:
Código:
r = r + V[i][1] * V[i + 1][2] * V[i + 2][3];

"i + 1", "i + 2" y 3 no son indices validos. Mismo caso con el ultimo bucle.

* En el tercer y penultimo bucle lo primero que haces con la variable "r" es incrementar su valor:
Código:
r = r + V[i][1] * V[i + 1][2] * V[i + 2][3];

El problema es que esta no tiene uno inicial, debes inicializarla antes con el valor cero.

Bueno, esperemos que alguien (con suerte Pantalàimon_) le de una revisada al algoritmo.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
Pantalàimon_



Registrado: 17 Jul 2007
Mensajes: 1344

MensajePublicado: 09/10/2011 10:59 pm
Título:

rir3760 escribió:

Bueno, esperemos que alguien (con suerte Pantalàimon_) le de una revisada al algoritmo.

No me había dado cuenta de este post.

Hola DrPuertas

He mirado tu función y no acabo de comprenderla. Ya el prototipo estaría mal, pues para calcular el determinante necesitarías solamente un dato de entrada matriz y que te retorne un entero. ¿Entonces por qué tu función acepta dos matrices como argumentos?

Parece que por un lado intentes calcular la matriz traspuesta:
Código:
      for (i=0;i<3;i++)
    {
        for (j=0;i<3;j++)
        {
            F[i][j]=V[i][j];
        }
    }

lo cual sería un inicio para calcular el determinante por adjuntos pero después ya no sé que haces en el siguiente bucle:
Código:
        for (i=0;i<3;i++)
        {
            for (j=0;i<3;j++)
            {
                F[3+1][j]=V[i][j];
            }
        }

Ya de primeras F[3+1][j] está fuera de los rangos posibles como indico rir3760

Después tenemos lo único que parece aprovechable de código para el calculo del determinante:
Código:
        for (i=0;i<3;i++)
        {
            r=r+V[i][1]*V[i+1][2]*V[i+2][3];
        }
        for (i=0;i<3;i++)
        {
            r1=r1+V[i][3]*V[i+1][2]*V[i+2][1];
        } 

Que calcularia bien los términos positivos y negativos del determinante según la regla de Sarrus, si aplicaras módulo 3 a los indices de la matriz que recorres -cosa que a la vez solucionaría el problema de que estuvieran fuera de rango- e inicializaras r y r1 a 0 por lo que te indicó rir3760. Entonces r representaría la suma de términos positivos del determinante y r1, la suma de términos negativos.

Después deberías devolver dicho valor mediante:
Código:
   return r - r1;

en vez de mostrarlo por pantalla. Por la razón básica de que la función devuelve un int y r-r1 es el valor que corresponderia al determinante.

Un saludo!
Volver arriba
      Índice del Foro elrincondelc.com -> Algoritmos
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com