使用Python计算行列式的代码,不使用scipy.linalg.det
描述(这是一个作业问题):
我不知道从哪里开始。我打算使用拉普拉斯展开,但不太确定如何在nxn矩阵上实现它。任何帮助都会很感激。
注意:我已经有一个函数可以生成nxn矩阵的随机矩阵。而且计算的时间不是问题。我唯一遇到的问题是如何计算行列式。
因为我的课堂政策,不得不删除问题描述。
5 个回答
1
def minor(array,i,j):
c = array
c = c[:i] + c[i+1:]
for k in range(0,len(c)):
c[k] = c[k][:j]+c[k][j+1:]
return c
def det(array,n):
if n == 1 :return array[0][0]
if n == 2 :return array[0][0]*array[1][1] - array[0][1]*array[1][0]
sum = 0
for i in range(0,n):
m = minor(array,0,i)
sum =sum + ((-1)**i)*array[0][i] * det(m,n-1)
return sum
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
3
好的,这里有个提示。
- 写一个函数来计算小矩阵。(提示:可以用切片)
- 写一个函数来计算余子式(这个函数需要调用第一个函数和行列式的函数)
- 行列式的函数会调用第二步的函数,然后把结果加起来。(提示:可以用
sum
)
这样,你就得到了行列式。
另外,别忘了因为我们在Python中写列表的方式,索引是反过来的。也就是说,如果
M = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
那么 m0,1 是 2,而不是正常表示法中的 4。你可以把它想象成转置,或者使用 zip
。
11
这里有一段用递归写的Python代码,用于计算一个矩阵的行列式。
def getMatrixMinor(m,i,j):
return [row[:j] + row[j+1:] for row in (m[:i]+m[i+1:])]
def getMatrixDeternminant(m):
#base case for 2x2 matrix
if len(m) == 2:
return m[0][0]*m[1][1]-m[0][1]*m[1][0]
determinant = 0
for c in range(len(m)):
determinant += ((-1)**c)*m[0][c]*getMatrixDeternminant(getMatrixMinor(m,0,c))
return determinant
请注意,输入是一个数组的数组,表示一个n乘n的矩阵。