使用Python计算行列式的代码,不使用scipy.linalg.det

4 投票
5 回答
19853 浏览
提问于 2025-04-16 04:44

描述(这是一个作业问题):

我不知道从哪里开始。我打算使用拉普拉斯展开,但不太确定如何在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

好的,这里有个提示。

  1. 写一个函数来计算小矩阵。(提示:可以用切片)
  2. 写一个函数来计算余子式(这个函数需要调用第一个函数和行列式的函数)
  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的矩阵。

撰写回答