/
Inicio :: Foros

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

Determinante de una matriz??

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



Registrado: 02 Sep 2004
Mensajes: 67
Ubicación: santiago, Chile..

MensajePublicado: 10/06/2005 5:47 pm
Título: Determinante de una matriz??

Hola:
Estaba tratando de hacer un algoritmo para obtener el determinante de una matriz por la place... Creo que es un buen propuesto para los que les gusta hacer algoritmos Razz
Eso si, es para una matriz de mxn, o sea, para cualquier matriz.
Y debe lanzar sus respectivas advertencias si es que a la matriz no se le puede calcular el determinante( caso en que m!=n)
Bueno, a mi se me habia ocurrido hacerlo con una funcion recursiva y que el caso principal sea cuando la matriz quede de 2x2.
Bueno..se los dejo^^

A mi parecer solo requiere pensar un poquito.
Y eso es lo que hare apenas tenga tiempo Razz

Nos vemos!!
Volver arriba
pitukilloloco



Registrado: 11 May 2005
Mensajes: 448

MensajePublicado: 10/06/2005 6:45 pm
Título:

En cualquier libro de análisis numérico viene la resolución del determinante de una matriz. No veo por qué habría que tratar de resolverlo si ya están descritos ahí los algoritmos para hacerlo. Muchas veces se trata de mejorar un algoritmo que ya existe por cuestiones de eficiencia o de rapidez ¿es quizá esta tu motivación? ¿o no conoces ningún algoritmo que implemente esto?
Volver arriba
grandzam



Registrado: 10 Feb 2005
Mensajes: 159

MensajePublicado: 11/06/2005 6:57 pm
Título:

Aquí esta la implementación de un subprograma que resuelve determinantes en visual basic, ahora solo tienes que implementarlo en c.

Notas:
1. Redim no es una función de c asi que piensa que puedes hacer
2. Es un programa recursivo (se manda llamar a si mismo), si no entiendes lo que hace por favor manda otro mensaje para explicarte, pero primero piensa y entiende que es lo que hace...

Bueno a diferencia del compañero que contesto este mensaje antes, yo creo que es bueno que la gente nueva empiecen a hacer sus propios algoritmos y sobretodo a PENSAR, porque después se malacosumbran y quieren sacar todo de internet o de los libros, claro que leer libros y entrar a foros como este y preguntar sus dudas nos ayuda mucho a aprender más a todos, tanto a quien pregunta como a quién contesta.

Y esto no lo escribo para ofender a nadie, simplemente en mi opinión tratar de hacer un algoritmo de estos siempre ayuda a nuestro intelecto...

Otra cosa si la matriz no tiene solución (según entendí) cuando m!=n ('m' diferente de 'n') entonces solo va a tener solución cuando 'm' sea igual a 'n', si es ese el caso entonces, es una matriz de n*n

Y bueno la verdad pensando te enseñas mejor...

Código:


Public Sub Calc_Det(ByRef D() As Single, ByVal Orden As Integer, ByRef res As Single)
Dim col, j, Fila, L As Integer
Dim D2() As Single
Dim r2 As Single
res = 0
   If Orden = 1 Then
      res = D(1, 1)
   Else
     If Orden = 2 Then
        res = (D(1, 1) * D(2, 2)) - (D(1, 2) * D(2, 1))
     Else
       ReDim D2(1 To r, 1 To r)
       For col = 1 To Orden
          For Fila = 2 To Orden
             j = 1
             For L = 1 To Orden
                If L <> col Then
                  D2(Fila - 1, j) = D(Fila, L)
                  j = j + 1
                End If
             Next L
          Next Fila
          Calc_Det D2, Orden - 1, r2
          r2 = r2 * D(1, col)
          If (col Mod 2) <> 0 Then
             res = res + r2
          Else
             res = res - r2
          End If
       Next col
     End If
   End If
End Sub

Volver arriba
kykyou



Registrado: 02 Sep 2004
Mensajes: 67
Ubicación: santiago, Chile..

MensajePublicado: 13/06/2005 1:09 pm
Título:

Hola, Gracias por responder.
No te preocupes, no creo tener problemas...Wink
Para el que respondio primero, en realidad odio los libros, no encuentro cosa mas fome que ver una resolucion en un libro y como no lo vi en el foro (ya que lo busque) lo postee viendo que nadie lo habia hecho y pensando que podria servir a mas de alguna persona.
Prefiero pensar. Ademas no es por saber la respuesta...es por diversion.
No es tarea, no es nada.
Mi ramo de C ya lo pase el semestre pasado. Ademas fue solo lo basico
porque aun asi no estudio nada que requiera saber mas.

Bueno, le doy las gracias por sus respuestas =.

Saludos,

Kykyou.

PS : He ahi la gracia de hacer un algoritmo por mas simple que sea.
Volver arriba
Diabliyo



Registrado: 14 Abr 2004
Mensajes: 325
Ubicación: En la Luna

MensajePublicado: 14/06/2005 12:07 pm
Título:

Hola:

kykyou pues aunque no creas a NADIE le gusta leer, pero llegas a un nivel en el que comprendes que un LIBRO es un conjunto de datos que te ayudan a SUPERARTE, y te aseguro que NO ahi mejor cosa que aprendas, mas lo que esta en lso LIBROS...

Nose que edad tengas, pero el chiste no es saber y pasar, se supone que si elijes una carrera y un objetivo, es para ser el MEJOR y no un Mediocre (ose del monton) Very Happy... tambien recuerda que un 10 es solo un numero... y se ve a diario que los MAS INTELIGENTES no siempre llegan a ser los mejores... desconfia de los de 6 porke son gente interesante que posiblemente por el simple echo de ser mas astuta que tu, supoe realizar las cosas Very Happy...

Todo es por ti, solo una vez se vive... y no ahi cosa mejor que ser Elite Very Happy

byeee
_________________

Volver arriba
kykyou



Registrado: 02 Sep 2004
Mensajes: 67
Ubicación: santiago, Chile..

MensajePublicado: 15/06/2005 6:52 pm
Título:

Diabliyo escribió:
Hola:




kykyou pues aunque no creas a NADIE le gusta leer, pero llegas a un nivel en el que comprendes que un LIBRO es un conjunto de datos que te ayudan a SUPERARTE, y te aseguro que NO ahi mejor cosa que aprendas, mas lo que esta en lso LIBROS...

Nose que edad tengas, pero el chiste no es saber y pasar, se supone que si elijes una carrera y un objetivo, es para ser el MEJOR y no un Mediocre (ose del monton) Very Happy... tambien recuerda que un 10 es solo un numero... y se ve a diario que los MAS INTELIGENTES no siempre llegan a ser los mejores... desconfia de los de 6 porke son gente interesante que posiblemente por el simple echo de ser mas astuta que tu, supoe realizar las cosas Very Happy...

Todo es por ti, solo una vez se vive... y no ahi cosa mejor que ser Elite Very Happy

byeee


Lo que dices es cierto...
Pero ten en cuenta que mi especialidad no es esto.
mi carrera no tiene NADA que ver con la programacion. Es solo una cosa de aficion mia y nada más...eso ya lo he dicho.
Cosa que no me gusten los libros no es que no me guste leer..simplemente prefiero llevar a cabo lo que leo y desde un libro no es muy comodo...ahh, y prefiero aprender en páginas web ^^U..es más comodo y sin duda más barato.
Pero en fin...no quiero ser mala onda y nada, gracias por los consejos.
Me gusta mucho el ambiente de esta página como para enemistarme con alguien, solo que tampoco me gusta que me respondan mal pu o en modo despectivo.
Y no dudes en que no soy del monton (o por lo menos trato de no serlo), ni tampoco subestimo a los de "6" que en mi caso seria 4 o 5 :S
Pues en mi pais la nota maxima es el 7 =P

De nuevo, gracias por todo!!
Volver arriba
tonilope



Registrado: 16 Oct 2005
Mensajes: 255

MensajePublicado: 18/10/2005 2:29 am
Título: Yo tengo una solución recursiva.

Yo lo hice hace casi dos años (desde cero tb, a modo de reto personal). La verdad es que al principio la idea estaba clara pero no fue hasta un día en clase de álgebra que me vino la inspiración xD. Bueno, no me enrollo más, aquí lo tienes si lo quieres como guía de pistas:

Código:

/*
CALCULADOR de DETERMINANTES de orden n
Autor: Antonio López Vivar
Fecha: 1 de diciembre de 2003
Revisión: final 1.0
*/

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

//Prototipos
float Determinante (float **, int);
void Adjunta (float **, float **, int, int);
 
//Principal
void main()
{
    int n, i, f, c;
    float **matriz;
    char comando;
   
    for(i=0; i<3; i++)
    {
    printf("\n\n\tBienvenido al CaLcuLaDOR de DeTERminanTes de orden n marca MIKASA");
   
    sleep(500);
    system("cls");
   
    printf("\n\n\tBienvenido al CaLcuLaDOR de DeTERminanTes de orden n marca MIKASA");
    printf("\n\n\n\n\n\n\n\t\t\tUna utilidad de Antonio Lopez Vivar");
   
    sleep(500);
    system("cls");
    }
   
   
   
    do{
    do{
    system("cls");
    printf("\n\n\tNota--> Este programa utiliza una funcion recursiva. Abstenerse de introducir matrices de orden elevado (mayor de 10), puesto que el consumo de RAM puede ser bestial");
   
   
    printf("\n\n\tORDEN?>\t");
   
    scanf("%d", &n);
    }while(n<1);
   
    //Petición de memoria dinámica para la matriz
    matriz=(float**)calloc(n, sizeof(float*));
    if(matriz==NULL)
    printf("ERROR, FALTA MEMORIA PARA LA MATRIZ. Introduzca un orden MUCHO mas pequeño");
    else
    {
    for(i=0; i<n; i++)
        matriz[i]=(float*)calloc(n, sizeof(float));   
   
    //Lectura por teclado de la matriz
    for(f=0; f<n; f++)
        for(c=0; c<n; c++)
            {printf("\nIntroduce el elemento %d de la fila %d  --->\t", c+1, f+1);
             scanf("%f", &matriz[f][c]);
            }
           
    //Se muestra la matriz al usuario
    system("cls");
    printf("\n\n\n");
    for(f=0; f<n; f++)
        {
            printf("\t\t");
            for(c=0; c<n; c++)
                printf("%12.1f ", matriz[f][c]);
           
            printf("\n");
        }
     printf("\n\n\n\t\tCalculando el determinante, por favor espere...\n\t\t(Para abortar el calculo pulse CTRL+C)\n");
     printf("\n\n\n\n\n\t\t\tEl determinante es:");
     printf("\n\n\n\t\t\t\t%.1f\n\n\n\n\n\t\t", Determinante(matriz, n));
   
     //Se libera la memoria solicitada
     free(matriz);
         
     }
     printf("Pulsa INTRO para calcular OTRO determinante, o pulsa S para SALIR");
     fflush(stdin);
     comando=getch();
     }while(comando!='s' && comando!='S');

}

/*
Esta función recursiva se encarga del cálculo del determinante propiamente dicho.
Recibe:
   - La matriz (referencia).
   - Orden de la matriz (valor).

Devuelve:
   - El determinante (valor).
*/

float Determinante (float **mat, int orden)
{
    float det;
    int h;
   
    float **auxiliar;
   
   
    //Caso básico
    if(orden<=2)
        {
                if(orden==2)
                                det=mat[0][0]*mat[1][1]-(mat[1][0]*mat[0][1]);
                               
                else
                                det=mat[0][0];
        }
    //Se calculan n determinantes de orden "n-1".
    else
        {
                //Petición de memoria dinámica para la matriz auxiliar
                    auxiliar=(float**)calloc(orden-1, sizeof(float*));
                        for(h=0; h<orden-1; h++)
                                auxiliar[h]=(float*)calloc(orden-1, sizeof(float));
               
                //Se usa un acumulador para ir sumando los determinantes de orden n-1
                det=0;
               
                for(h=0; h<orden; h++)
                {               Adjunta(mat, auxiliar, orden, h);
                                det+=pow(-1, h)*mat[h][0]*Determinante(auxiliar, orden-1);
                }
               
                //Se libera la memoria auxiliar solicitada
                free(auxiliar);
        }
       
       
        return(det);
       
}


/*
Esta función se encarga de calcular la matriz resultante de tachar la primera columna y alguna de las n filas de la matriz inicial.
Recibe:
   - La matriz inicial (referencia).
   - El orden de la matriz inicial(valor).
   - La fila que hay que tachar de la matriz inicial (valor).

Devuelve:
   - La matriz auxiliar que se usará para calcular los determinates de orden n-1 (referencia).
*/
void Adjunta (float **mat, float **aux, int orden, int pos)
{
    int fila, columna, j, i;
   
    for(j=0, fila=0; fila<orden-1; j++, fila++)
        {
                if(j==pos)
                                fila--;
                else
                        for(i=1, columna=0; columna<orden-1; i++, columna++)
                              aux[fila][columna]=mat[j][i];
                             
         }                     
}




Salu2 Wink
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