elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
29 Mayo 2012, 00:42  


Tema destacado: Suscripción al boletín mensual de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  [C] Calcular determinante de una matriz de orden 'n'
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Calcular determinante de una matriz de orden 'n'  (Leído 10,137 veces)
Kasswed
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.202


Andalucía


Ver Perfil
[C] Calcular determinante de una matriz de orden 'n'
« en: 11 Enero 2009, 20:53 »

Hola.

A ver si alguien me puede explicar algún algoritmo o darme algún pseudocódigo (por favor nada de álgebra), para calcular en C el determinante de una matriz de orden 'n'.

Muchas gracias.


En línea

"He who allows himself to be insulted, deserves to be."

Repórtame cualquier falta a las normas del foro por mensaje privado.
Anibal784


Desconectado Desconectado

Mensajes: 762

Yo no la vote, pero me la tengo que aguantar igual


Ver Perfil WWW
Re: [C] Calcular determinante de una matriz de orden 'n'
« Respuesta #1 en: 12 Enero 2009, 00:56 »

Cómo que nada de álgebra si el determinante de una matriz es de álgebra. Esto es tan sencillo, es sólo cuestión de encontrar la definición, ver un método de cómo calcularla y transformar ese método en el algoritmo en el lenguaje que te gusta.


En línea

El que llega sin que lo llamen, se va sin que lo echen.

Citar
Vos no la votaste por eso la tenes adentro.
Lo fino no es lo tuyo, y a mi me chupa un huevo, soy argentino y no peronista, y eso es lo que realmente te molesta.
Kasswed
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.202


Andalucía


Ver Perfil
Re: [C] Calcular determinante de una matriz de orden 'n'
« Respuesta #2 en: 12 Enero 2009, 01:02 »

Si es muy sencillo.

Bueno comentarios tan útiles como el tuyo se agradecen, se encuentran pocos hoy en día. La verdad es que no había caído en basarme en fórmulas algebraicas para hacer el algoritmo, menos mal que lo has dicho.

Gracias por la ayuda.
En línea

"He who allows himself to be insulted, deserves to be."

Repórtame cualquier falta a las normas del foro por mensaje privado.
VirucKingX


Desconectado Desconectado

Mensajes: 540


VirucKingX


Ver Perfil
Re: [C] Calcular determinante de una matriz de orden 'n'
« Respuesta #3 en: 12 Enero 2009, 01:15 »

Si es muy sencillo.

Bueno comentarios tan útiles como el tuyo se agradecen, se encuentran pocos hoy en día. La verdad es que no había caído en basarme en fórmulas algebraicas para hacer el algoritmo, menos mal que lo has dicho.

Gracias por la ayuda.

yo te entiendo, hace algun tiempo tambien intente hacer esto, pero nunca encontre una formula recursiva que funcionara com matrices de orden mayor que 5

Dale una mirada a esto, segun el autor dice que funciona. Pero yo no lo e probado

 
Citar


esop


Chau
En línea



Bye
fMtQr

Desconectado Desconectado

Mensajes: 91



Ver Perfil
Re: [C] Calcular determinante de una matriz de orden 'n'
« Respuesta #4 en: 7 Febrero 2012, 11:49 »

Aunque llego un poco tarde creo que tengo lo que buscais:

http://foro.elhacker.net/programacion_cc/determinante_matriz_de_orden_n-t352910.0.html
En línea

Que tengas un buen dia!
Xandrete

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: [C] Calcular determinante de una matriz de orden 'n'
« Respuesta #5 en: 7 Febrero 2012, 16:18 »

Perdón, sólo quería comentar para decir que me has partido el corazón (en un sentido negativo)...

Citar
por favor nada de álgebra

Me voy a llorar, lo siento  :-(

P.S. Que sepas que un hipopótamo ha muerto por tu culpa, xD
En línea
BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 2.831


I'Love...!¡.


Ver Perfil WWW
Re: [C] Calcular determinante de una matriz de orden 'n'
« Respuesta #6 en: 8 Febrero 2012, 08:37 »

Me espere unos dias antes de soltar el codigo...

Código
 
#include <stdlib.h>
#include <stdio.h>   //<stdio.h>
 
typedef
struct Matrix
{
   float **lpData;
   unsigned int uiRows;
   unsigned int uiCols;
}
MATRIX, *LPMATRIX;
 
LPMATRIX createMatrix(unsigned int uiRows, unsigned int uiCols)
{
   LPMATRIX lpRet = (LPMATRIX)malloc(sizeof(MATRIX));
   int i = 0;
   lpRet->uiCols = uiCols;
   lpRet->uiRows = uiRows;
   lpRet->lpData = (float**)malloc(sizeof(float*) * lpRet->uiRows);
   for (i = 0; i < lpRet->uiRows; i++)
       lpRet->lpData[i] = (float*)malloc(sizeof(float) * lpRet->uiCols);
   return lpRet;
}
 
void freeMatrix(LPMATRIX lpMatrix)
{
   int i = 0;
   if (!lpMatrix) return;
   for (i = 0; i < lpMatrix->uiRows; i++)
       free(lpMatrix->lpData[i]);
   free(lpMatrix->lpData);
   free(lpMatrix);
}
 
void showMatrix(LPMATRIX lpMatrix)
{
   int i = 0,
       j = 0;
   if (!(lpMatrix || lpMatrix->lpData)) return;
   for (i = 0; i < lpMatrix->uiRows; i++)
   {
       if (lpMatrix->lpData[i])
       {
           for (j = 0; j < lpMatrix->uiCols; j++)
               printf("\t%f", lpMatrix->lpData[i][j]);
           printf("\n");
       }
   }
}
 
int getDeterminant(LPMATRIX lpMatrix, float* lpOutDeterminant)
//  Retorna 0 si todo a ido bien, de lo contrario retorna un numero distinto de 0
{
   float fRet = 0.0f,
         fProduct = 0.0f;
   unsigned int i = 0,
                j = 0;
   if (!(lpMatrix || lpMatrix->lpData) || (lpMatrix->uiRows < 2) || (lpMatrix->uiCols < 2) || (lpMatrix->uiRows != lpMatrix->uiCols)) return -1;
 
   if (lpMatrix->uiCols == 2)
   {
       if (!(lpMatrix->lpData[0] && lpMatrix->lpData[1])) return -1;
       fRet = lpMatrix->lpData[0][0] * lpMatrix->lpData[1][1] - lpMatrix->lpData[1][0] * lpMatrix->lpData[0][1];
 
   } else {
       for (i = 0; i < lpMatrix->uiRows; i++)
       {
           if (!lpMatrix->lpData[i]) return -1;
           //  Multiplicacion de valores verticales de izquierda a derecha...
           fProduct = 1.0f;
           for (j = 0; j < lpMatrix->uiCols; j++)
               fProduct *= lpMatrix->lpData[(i + j) % lpMatrix->uiCols][j];
           fRet += fProduct;
 
           //  Multiplicacion de valores verticales de derecha a izquierda...
           fProduct = 1.0f;
           for (j = 0; j < lpMatrix->uiCols; j++)
               fProduct *= lpMatrix->lpData[(lpMatrix->uiCols - 1) - ((i + j) % lpMatrix->uiCols)][j];
           fRet -= fProduct;
       }
   }
   if (lpOutDeterminant)
       *lpOutDeterminant = fRet;
 
   return 0;
}
 
int main()
{
   LPMATRIX lpMatrix = createMatrix(3,3);
   float fDeterminant = 0.0;
   int i = 0,
       j = 0;
   for (i = 0; i < lpMatrix->uiRows; i++)
   {
       for (j = 0; j < lpMatrix->uiCols; j++)
       {
           printf("[%d][%d] = ",i, j); fflush(stdout);
           scanf("%f", &lpMatrix->lpData[i][j]);
       }
   }
   fflush(stdout);
   showMatrix(lpMatrix);
   if (getDeterminant(lpMatrix, &fDeterminant) == 0)
       printf("Determinante = %f\n", fDeterminant);
   freeMatrix(lpMatrix);
 
   getchar();
 
   return EXIT_SUCCESS;
}
 
 

Temibles Lunas!¡.
En línea

Web Principal-->[ Blog(VB6) | Host File (Public & Private) | Scan Port | (New)MyInfraPC (Descubre mi Contraseña venefi. $) ]



The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilith y el metal mi
do-while


Desconectado Desconectado

Mensajes: 604


Cuando me afeito, recuerdo porque me dejo barba.


Ver Perfil
Re: [C] Calcular determinante de una matriz de orden 'n'
« Respuesta #7 en: 8 Febrero 2012, 14:56 »

¡Buenas!

Un metodo sencillo (aunque intuyo que no el mas eficiente) seria diagonailzar la matriz por Gauss y multiplicar los elementos de la diagonal.

Tambien puedes hacer ceros por ejemplo en la primera columna y aplicar la definicion. Te hara falta un algoritmo recursivo que repita el proceso para matrices de menor orden que la dada (hasta llegar a matrices 1x1):

|A| = Suma(desde i = 1 hasta n)(-1)i+j·aij·|Aij|

Donde i es el indice de la fila, j el de una columna prefijada y Aij es la matriz resultante de eliminar de A la fila i y columna j.

La definicion basica de determinanta se realiza ulilizando sumas de productos de permutaciones de los elementos de las filas multiplicando en cada suma por la signatura de la permutacion, pero esto ya es mas complicado de implementar, y el hecho de tener que estar calculando permutaciones hara que el algoritmo sea muy poco eficiente.

Te recomiendo cualquiera de los dos primeros algoritmos. El primero es iterativo y el segundo recursivo.

¡Saludos!
« Última modificación: 8 Febrero 2012, 14:58 por do-while » En línea

¡¡¡Feliz año nuevo!!!
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda - Buscar si existe una matriz dentro de otra matriz
Programación Visual Basic
EddyW 2 1,875 Último mensaje 14 Agosto 2010, 06:18
por EddyW
Matriz Dentro de otra matriz
Programación Visual Basic
moba741120 3 1,627 Último mensaje 13 Abril 2011, 18:29
por raul338
C:Calcular montañas en los datos almacenados en una matriz « 1 2 »
Programación C/C++
deifk 18 700 Último mensaje 19 Enero 2012, 00:07
por Xandrete
Determinante matriz de orden 'N'
Programación C/C++
fMtQr 1 866 Último mensaje 7 Febrero 2012, 12:29
por ghastlyX
Ayuda! Calcular determinante en Java
Java
fMtQr 2 573 Último mensaje 3 Marzo 2012, 23:01
por fMtQr
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines