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