Autor
|
Tema: [C] Calcular determinante de una matriz de orden 'n' (Leído 39,711 veces)
|
Kasswed
|
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
Mensajes: 762
Yo no la vote, pero me la tengo que aguantar igual
|
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. 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
|
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
Mensajes: 541
VirucKingX
|
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 esop Chau
|
|
|
En línea
|
Bye
|
|
|
juancaa
Desconectado
Mensajes: 140
[ Img^(Img) = Real ]
|
|
|
|
En línea
|
Que tengas un buen dia!
|
|
|
Xandrete
Desconectado
Mensajes: 210
|
Perdón, sólo quería comentar para decir que me has partido el corazón (en un sentido negativo)... 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
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
Me espere unos dias antes de soltar el codigo... #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 ]); } 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 ]); } } } 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++) { scanf("%f", &lpMatrix ->lpData [i ][j ]); } } showMatrix(lpMatrix); if (getDeterminant(lpMatrix, &fDeterminant) == 0) printf("Determinante = %f\n", fDeterminant ); freeMatrix(lpMatrix); return EXIT_SUCCESS; }
Temibles Lunas!¡.
|
|
|
En línea
|
The Dark Shadow is my passion.
|
|
|
do-while
Desconectado
Mensajes: 1.276
¿Habra que sacarla de paseo?
|
¡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 pm por do-while »
|
En línea
|
- Doctor, confundo los números y los colores. - Vaya marrón. - ¿Marrón? ¡Por el culo te la hinco!
|
|
|
Crowsnest
Desconectado
Mensajes: 1
|
Hola Amigos:
Aunque no este en C++, es facil de traducir.
Aqui os dejo un codigo mio en VB.NET para resolver determinantes de orden n x n
Declaracion de la clase desde programa en VB.NET Dim clase As SolDet = New SolDet()
LLAMADAS A LA CLASE SolDet (renombrada "clase" en el ejemplo): clase.resuelve(test,n, n), ejecuta calculo Matricial clase.Calcula(n, n), Devuelve valor determinante
Donde Det es la matriz a calcular yn,n son las dimensiones de la Matriz. La matriz esta ordenada por filas, ejpl. {{1,2,3,4},{2,1,4,7},.........}
clase.ver_datos(), devuelve matriz diagonalizada.
Public Class SolDet
'by jmlv-Crowsnest Public paso(1, 1) As Double
Public Sub resuelve(ByVal det, ByVal ylim, ByVal xlim)
If xlim <> ylim Then MsgBox("Only squared matrixes allowed") Exit Sub End If
ReDim paso(ylim - 1, xlim - 1) ' row-col Number Dim x, y As Integer Dim f, referencia, operador As Double Dim acarreo As Integer
'det() Reference Matrix 'paso() Result Matrix
Array.Copy(det, paso, det.length) 'Build initial result matrix
For acarreo = 0 To xlim - 2 ' Move row selection pointer for zero making
referencia = -det(acarreo, acarreo) 'Diagonal reference value
For y = acarreo + 1 To ylim - 1 'Move along row of column y
operador = det(y, acarreo) 'Matrix element at the same column than reference
f = operador / referencia 'Multiplication factor for row Y
For x = 0 To xlim - 1 'Move and apply f along row
paso(y, x) = det(acarreo, x) * f + det(y, x)
Next
Next
'Rebuild reference Matrix. Array.Copy(paso, det, paso.Length) Array.Copy(det, paso, det.length)
Next
End Sub
Public Function ver_datos() As Array
Return paso End Function
Public Function Calcula(ByVal ylim, ByVal xlim) As Double Dim y As Integer Dim prod As Double
prod = 1
For y = 0 To ylim - 1
prod = prod * paso(y, y)
Next
Return prod
End Function
End Class
NOTAS: Metodo de Gauss, admite cualquier orden n.
Un saludo
|
|
« Última modificación: 24 Enero 2013, 13:11 pm por Crowsnest »
|
En línea
|
|
|
|
flony
Desconectado
Mensajes: 584
|
yo se que hay ganas de ayudar y eso ...pero alguien se fijo la fecha Publicado en: Enero 11, 2009, 04:53:58 de todas formas en el transcurso de los días respondo es un lindo desafió
|
|
|
En línea
|
si un problema no tiene solucion entonces no es un problema...es algo inevitable
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Determinante matriz de orden 'N'
Programación C/C++
|
juancaa
|
1
|
12,257
|
7 Febrero 2012, 12:29 pm
por ghastlyX
|
|
|
Ayuda! Calcular determinante en Java
Java
|
juancaa
|
4
|
11,141
|
14 Agosto 2012, 18:41 pm
por adwind
|
|
|
[C] [Source] Determinante Matriz orden "N"
Programación C/C++
|
juancaa
|
0
|
3,157
|
13 Junio 2012, 02:26 am
por juancaa
|
|
|
Calcular determinante de una matriz NxN
Programación C/C++
|
amchacon
|
1
|
15,380
|
13 Febrero 2013, 20:35 pm
por leosansan
|
|
|
[C] Determinante de orden N
Programación C/C++
|
BatchianoISpyxolo
|
4
|
5,219
|
31 Marzo 2013, 15:18 pm
por leosansan
|
|