14-10-2015 18:32
A ver si podéis echarme un cable. Me puse a hacer un programa con python para invertir matrices mediante una descomposición LU. El método incluye una permutación de la matriz, para lo que hay que hacer una matriz de permutación vía pivotación parcial a partir de una matriz identidad. Osease, tenemos tres matrices:
Para hacer esto yo creé una función que me busca ese valor mayor y me devuelve su posición. Pero luego, mirando ejemplos de esto mismo en internet, me topé con que lo están haciendo metiendo un keyword con una función lambda en la función max(), y no entiendo de qué va el tema. He mirado el tema de funciones lambda y keywords y me pierdo. ¿Alguno podéis arrojar algo de luz al respecto de estas funciones lambda y los keyword?
Mi código para sacar la matriz P:
Y el código que vi y me dejó roto:
Y para usarlo por ejemplo tal que así:
Edito: Me cago en la leche, Merche, el foro se carga la identación. Apaña esto, Jase > : ( .
(Ultima edición: 15-10-2015 10:10 por AcAnchoa.)
- La matriz a invertir --> M
- La matriz identidad --> I
- La matriz de permutación --> P
Para hacer esto yo creé una función que me busca ese valor mayor y me devuelve su posición. Pero luego, mirando ejemplos de esto mismo en internet, me topé con que lo están haciendo metiendo un keyword con una función lambda en la función max(), y no entiendo de qué va el tema. He mirado el tema de funciones lambda y keywords y me pierdo. ¿Alguno podéis arrojar algo de luz al respecto de estas funciones lambda y los keyword?
Mi código para sacar la matriz P:
Código:
def pivot(M):
def find_idx(j):
col = [ abs(M[i][j]) for i in range(j,r) ]
return j + col.index(max(col))
r = len(M)
P = [ [float(i == j) for i in range(r)] for j in range(r) ]
for j in range(r):
swap = find_idx(j)
if j != swap:
P[j], P[swap] = P[swap], P[j]
return P
Y el código que vi y me dejó roto:
Código:
def pivot(M):
r = len(M)
P = [ [float(i == j) for i in range(r)] for j in range(r) ]
for j in range(r):
swap = max( range(j,r), key=lambda i: abs(M[i][j]) )
if j != swap:
P[j], P[swap] = P[swap], P[j]
return P
Y para usarlo por ejemplo tal que así:
Código:
F = [2 ,3 ,4 ,4], [3 ,-1 ,7 ,2], [6 ,4 ,-4 ,0], [1 ,6 ,-2 ,1]
P = pivot(F)
for j in range( len(P) ):
print( [round(P[j][i],3) for i in range(len(P))] )
Edito: Me cago en la leche, Merche, el foro se carga la identación. Apaña esto, Jase > : ( .