我即将编写一些代码,用拉普拉斯算法(即递归算法),计算一个方阵(nxn)的行列式,具体实现可以参考维基百科的 拉普拉斯展开。
我已经有了类 Matrix,并包括初始化、setitem、getitem、repr等所需要的所有内容来计算行列式(包括 minor(i,j) 函数)。
所以我尝试了下面的代码:
预期的是,在每个递归调用中,
我已经有了类 Matrix,并包括初始化、setitem、getitem、repr等所需要的所有内容来计算行列式(包括 minor(i,j) 函数)。
所以我尝试了下面的代码:
def determinant(self,i=0) # i can be any of the matrix's rows
assert isinstance(self,Matrix)
n,m = self.dim() # Q.dim() returns the size of the matrix Q
assert n == m
if (n,m) == (1,1):
return self[0,0]
det = 0
for j in range(n):
det += ((-1)**(i+j))*(self[i,j])*((self.minor(i,j)).determinant())
return det
预期的是,在每个递归调用中,
self
会变成一个适当的次要矩阵。但是当从递归调用返回时,它不会变回原始矩阵。这在for
循环中会造成麻烦(当函数到达(n,m)==(1,1)
时,返回矩阵的这一个值,但在for
循环中,self
仍然是一个1x1的矩阵 - 为什么?)
self.minor(i,j)
实际上是否会改变self
? - Radio-assert isinstance(self, Matrix)
)没有任何作用 - 它是Matrix
上的一个方法,所以您确定self
是一个Matrix
。第二个会更好地使用类似于``if n!= m:raise ValueError("Matrix is not square")`的东西,因为异常更具体地说明了问题(并且可以更容易地被捕获)。 - Benjamin Hodgson