我正在尝试编写一个程序来查找Python 3.3中NxN矩阵的行列式,但它返回“列表索引超出范围”错误。在det函数中有一个调试打印语句,它表明在给定的2 x 2矩阵示例的情况下,它适用于第一个小调,但是A减少到[[3]]而我看不到我的代码的哪一部分正在改变它?我希望det函数在第一行工作时保持A不变。
def minor(matrix,i):
"""Returns the Minor M_0i of matrix"""
minor = matrix
del minor[0] #Delete first row
for b in list(range(len(matrix))): #Delete column i
del minor[b][i]
return minor
def det(A):
"""Recursive function to find determinant"""
if len(A) == 1: #Base case on which recursion ends
return A[0][0]
else:
determinant = 0
for x in list(range(len(A))): #Iterates along first row finding cofactors
print("A:", A)
determinant += A[0][x] * (-1)**(2+x) * det(minor(A,x)) #Adds successive elements times their cofactors
print("determinant:", determinant)
return determinant
data = [[4, 3], [6, 3]]
print(det(data))
答案 0 :(得分:3)
执行minor = matrix
时,您没有创建矩阵的副本,而只是创建一个新的引用。当您下次从minor
删除行时,您也会从matrix
删除该行。
copy.deepcopy
可能会做你需要的。
答案 1 :(得分:1)
def minor(matrix,i):
n = len(matrix)
minor = []
minor = matrix.copy()
row = i//n
col = i%n - 1
del minor[row] #Delete first row
for j in list(range(len(minor))): #Delete column i
recover_row = list(matrix[j])
del minor[j][col]
matrix[j] = recover_row
return minor
这是我保留原始矩阵的决心。当我试图找出一种方法时,你的代码对我帮助很大!让我们说这是一个主要情况,其中for循环比嵌套while循环更好用哈哈
答案 2 :(得分:-1)
我认为这不应该是“矩阵”,而应该是“次要的”。
for b in list(range(len(matrix))):
#Delete column i