列表索引超出范围 - 使用函数分解矩阵时出现问题
list index out of range - problem with using function to decompose matrix
我尝试使用此代码对 nxn 矩阵进行 LU 分解,但我一直得到 'IndexError: list index out of range'。知道这里出了什么问题以及如何解决这个问题吗?
import numpy as np
import pylab
from pprint import pprint
def matrixMul(A, B):
TB = zip(*B)
return [[sum(ea*eb for ea,eb in zip(a,b)) for b in TB] for a in A]
def permut(m):
n = len(m)
ID = [[float(i == j) for i in range(n)] for j in range(n)]
for j in range(n):
row = max(range(j, n), key=lambda i: abs(m[i][j]))
if j != row:
ID[j], ID[row] = ID[row], ID[j]
return ID
def lu(A):
n = len(A)
L = [[0.0] * n for i in range(n)]
U = [[0.0] * n for i in range(n)]
P = permut(A)
A2 = matrixMul(P, A)
for j in range(n):
L[j][j] = 1.0
for i in range(j+1):
s1 = sum(U[k][j] * L[i][k] for k in range(i))
U[i][j] = A2[i][j] - s1
for i in range(j, n):
s2 = sum(U[k][j] * L[i][k] for k in range(j))
L[i][j] = (A2[i][j] - s2) / U[j][j]
return (L, U, P)
我一直在尝试通过以下代码使用上述功能:
a = np.array([[2, 1, 5], [4, 4, -4], [1, 3, 1]]);
for part in lu(a):
pprint(part)
print
print
它应该是 return 矩阵 L,U,P
但我得到的只是这条错误信息:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-52-da52bba817aa> in <module>()
1 a = np.array([[2, 1, 5], [4, 4, -4], [1, 3, 1]]);
----> 2 for part in lu(a):
3 pprint(part)
4 print
5 print
<ipython-input-51-e49d88430e36> in lu(A)
27 for i in range(j, n):
28 s2 = sum(U[k][j] * L[i][k] for k in range(j))
---> 29 L[i][j] = (A2[i][j] - s2) / U[j][j]
30 return (L, U, P)
31 print(L)
您的 matrixMul 函数没有按照您的要求执行,A2 的形状错误。
你想要这个
return [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]
问题似乎出在 matrixMul
中的这一行:
TB = zip(*B)
zip
returns 一个迭代器,你只能迭代一次内容。如果您查看 A2
的值,您会发现它是 [[4.0, 4.0, -4.0], [], []]
.
您可以通过将上面的行替换为
来解决问题
TB = list(zip(*B))
将 TB
设置为一个列表,该列表可以根据需要迭代多次,或者删除此行并重写下面的行,如下所示:
return [[sum(ea*eb for ea,eb in zip(a,b)) for b in zip(*B)] for a in A]
在这种情况下,zip(*B)
将针对 A
中的每一行计算一次,因此您将获得一个全新的迭代器来迭代每一行。
我尝试打印矩阵 A2。我明白了
A2 =
[[4.0, 4.0, -4.0], [], []]
看起来 matrixMul 函数工作不正常
我换了
A2 = matrixMul(P, A)
有了这个。
A2 = np.dot(P, A)
numpy.dot函数相当于二维数组(即矩阵)的矩阵乘法
错误消失了。
但是,我不能告诉你LU分解答案的正确性。
我尝试使用此代码对 nxn 矩阵进行 LU 分解,但我一直得到 'IndexError: list index out of range'。知道这里出了什么问题以及如何解决这个问题吗?
import numpy as np
import pylab
from pprint import pprint
def matrixMul(A, B):
TB = zip(*B)
return [[sum(ea*eb for ea,eb in zip(a,b)) for b in TB] for a in A]
def permut(m):
n = len(m)
ID = [[float(i == j) for i in range(n)] for j in range(n)]
for j in range(n):
row = max(range(j, n), key=lambda i: abs(m[i][j]))
if j != row:
ID[j], ID[row] = ID[row], ID[j]
return ID
def lu(A):
n = len(A)
L = [[0.0] * n for i in range(n)]
U = [[0.0] * n for i in range(n)]
P = permut(A)
A2 = matrixMul(P, A)
for j in range(n):
L[j][j] = 1.0
for i in range(j+1):
s1 = sum(U[k][j] * L[i][k] for k in range(i))
U[i][j] = A2[i][j] - s1
for i in range(j, n):
s2 = sum(U[k][j] * L[i][k] for k in range(j))
L[i][j] = (A2[i][j] - s2) / U[j][j]
return (L, U, P)
我一直在尝试通过以下代码使用上述功能:
a = np.array([[2, 1, 5], [4, 4, -4], [1, 3, 1]]);
for part in lu(a):
pprint(part)
print
print
它应该是 return 矩阵 L,U,P 但我得到的只是这条错误信息:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-52-da52bba817aa> in <module>()
1 a = np.array([[2, 1, 5], [4, 4, -4], [1, 3, 1]]);
----> 2 for part in lu(a):
3 pprint(part)
4 print
5 print
<ipython-input-51-e49d88430e36> in lu(A)
27 for i in range(j, n):
28 s2 = sum(U[k][j] * L[i][k] for k in range(j))
---> 29 L[i][j] = (A2[i][j] - s2) / U[j][j]
30 return (L, U, P)
31 print(L)
您的 matrixMul 函数没有按照您的要求执行,A2 的形状错误。
你想要这个
return [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*Y)] for X_row in X]
问题似乎出在 matrixMul
中的这一行:
TB = zip(*B)
zip
returns 一个迭代器,你只能迭代一次内容。如果您查看 A2
的值,您会发现它是 [[4.0, 4.0, -4.0], [], []]
.
您可以通过将上面的行替换为
来解决问题 TB = list(zip(*B))
将 TB
设置为一个列表,该列表可以根据需要迭代多次,或者删除此行并重写下面的行,如下所示:
return [[sum(ea*eb for ea,eb in zip(a,b)) for b in zip(*B)] for a in A]
在这种情况下,zip(*B)
将针对 A
中的每一行计算一次,因此您将获得一个全新的迭代器来迭代每一行。
我尝试打印矩阵 A2。我明白了
A2 =
[[4.0, 4.0, -4.0], [], []]
看起来 matrixMul 函数工作不正常
我换了
A2 = matrixMul(P, A)
有了这个。
A2 = np.dot(P, A)
numpy.dot函数相当于二维数组(即矩阵)的矩阵乘法
错误消失了。
但是,我不能告诉你LU分解答案的正确性。