我试图找到一个表示二维矩阵的嵌套列表的行列式。但它无限调用getMinor()函数并不断从同一列表中删除,这不应该发生,因为我每次都在创建新列表。下面是代码。此外,所有函数都在名为' Matrix()'。
的类中定义def __init__(self):
self.matrix_list = []
self.no_of_row = 0
self.no_of_col = 0
def getMinor(self, matrix, j):
del matrix[0]
for i in range(len(matrix)):
del matrix[i][j]
m = Matrix()
m.matrix_list = matrix[:]
m.no_of_row = len(m.matrix_list)
#print(m.no_of_row)
print(m.matrix_list)
m.no_of_col = len(m.matrix_list[0])
return m.detMatrix()
def detMatrix(self):
if self.no_of_row == 2 and self.no_of_col == 2:
return self.matrix_list[0][0] * self.matrix_list[1][1] - self.matrix_list[0][1] * self.matrix_list[1][0]
else:
matrix = self.matrix_list[:]
det = 0
for i in range(self.no_of_col):
det += ((-1)**i) * self.matrix_list[0][i] * self.getMinor(matrix, i)
return det
答案 0 :(得分:1)
你有两个问题。一个是由user2357112提到的,遗憾的是他没有费心去解释。当您使用表达式x [:]时,您将获得列表x的浅表副本。深拷贝和浅拷贝通常没有实际区别;例如,如果x包含数字或字符串。但在你的情况下,x的元素是列表。新列表的每个元素x [:]将与原始x中的子列表相同 - 而不是副本。当您删除这些嵌套列表中的一个元素(del matrix [i] [j])时,您将删除一些原始数据。
第二个问题是你没有正确处理递归。您可以在函数detMatrix中创建一个新变量matrix。即使您在此处进行深层复制,也无法解决问题。您将矩阵传递给getMinor,它会从中删除一些数据。现在,在你的for循环的下一步中,你搞砸了数据。您需要在函数getMinor中内部进行深层复制。
这是一个至少运行的程序。我没检查你的代数: - )
我还要补充一点,效率很低。制作副本然后从副本中删除片段的想法没有多大意义。我没有解决这个问题。
import copy
class Matrix:
def __init__(self):
self.matrix_list = []
self.no_of_row = 0
self.no_of_col = 0
def getMinor(self, matrix_list, j):
print("Entry:", matrix_list)
matrix = copy.deepcopy(matrix_list)
del matrix[0]
for i in range(len(matrix)):
del matrix[i][j]
print("After deletions", matrix_list)
m = Matrix()
m.matrix_list = matrix[:]
m.no_of_row = len(m.matrix_list)
m.no_of_col = len(m.matrix_list[0])
x = m.detMatrix()
print(m.matrix_list, m.no_of_row, m.no_of_col)
return x
def detMatrix(self):
if self.no_of_row == 2 and self.no_of_col == 2:
return self.matrix_list[0][0] * self.matrix_list[1][1] - self.matrix_list[0][1] * self.matrix_list[1][0]
else:
det = 0
for i in range(self.no_of_col):
det += ((-1)**i) * self.matrix_list[0][i] * self.getMinor(self.matrix_list, i)
return det
m = Matrix()
m.matrix_list.append([0.0,1.0,2.0,3.0])
m.matrix_list.append([1.0,2.0,3.0,4.0])
m.matrix_list.append([2.0,3.0,4.0,5.0])
m.matrix_list.append([3.0,5.0,7.0,9.0])
m.no_of_row = 4
m.no_of_col = 4
print(m.detMatrix())