我将编写一些代码来计算方阵(nxn)的行列式,使用拉普拉斯算法(意义递归算法)编写Wikipedia's Laplace Expansion .
我已经有了类 Matrix
,其中包括 init , 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矩阵 - 为什么?)
4 回答
我发布了这段代码,因为我无法在互联网上使用它,如何使用标准库来解决n * n行列式 . 目的是与那些觉得有用的人分享 . 我开始计算与a(0,i)相关的子矩阵Ai . 我使用递归行列式使它变短 .
对不起之前没有评论:)如果你需要任何进一步的解释,请不要犹豫 .
你确定
minor
返回一个新对象而不是对原始矩阵对象的引用吗?我使用了您的确切行列式方法并为您的类实现了minor
方法,它对我来说很好 .下面是矩阵类的快速/脏实现,因为我不太重要,因为我们正在处理决定因素 . 注意
det
方法,与你的方法相同,并且minor
方法(其余的方法都是为了方便实现和测试):现在进行测试
在numpy情况下的残差是因为它通过(高斯)消除方法而不是拉普拉斯展开计算行列式 . 您还可以比较随机矩阵的结果,看看您的行列式函数和numpy 's doesn' t之间的差异超出
float
精度:这是python 3中的函数 .
注意:我使用一维列表来容纳矩阵,而size数组是方形数组中的行数或列数 . 它使用递归算法来查找行列式 .
嘿,我已经使用递归函数在MATLAB中编写了代码 . 这可能对您有所帮助 .