计算以列表形式输入的N x N矩阵的行列式 - “列表索引超出范围”

1 投票
3 回答
7324 浏览
提问于 2025-04-18 11:56

我正在尝试用Python 3.3写一个程序来计算一个NxN矩阵的行列式,但它返回了一个“列表索引超出范围”的错误。在det函数中有一个调试打印语句,它显示在给出的2x2矩阵示例中,第一次计算时一切正常,但之后A被缩减为[[3]],我看不出我的代码中哪个部分在改变它?我希望det函数在处理第一行时能保持A不变。

def minor(matrix,i):
    """Returns the Minor M_0i of matrix"""
    minor = matrix
    del minor[0] #Delete first row
    for b in list(range(len(matrix))): #Delete column i
        del minor[b][i]
    return minor

def det(A):
    """Recursive function to find determinant"""
    if len(A) == 1: #Base case on which recursion ends
        return A[0][0]
    else:
        determinant = 0
        for x in list(range(len(A))): #Iterates along first row finding cofactors
            print("A:", A)
            determinant += A[0][x] * (-1)**(2+x) * det(minor(A,x)) #Adds successive elements times their cofactors
            print("determinant:", determinant)
        return determinant

data = [[4, 3], [6, 3]]

print(det(data))

3 个回答

-1

我觉得这里应该用“minor”而不是“matrix”。

for b in list(range(len(matrix))): 
    #Delete column i
1
def minor(matrix,i):

    n = len(matrix)
    minor = []
    minor = matrix.copy()
    row = i//n
    col = i%n - 1
    del minor[row] #Delete first row
    for j in list(range(len(minor))): #Delete column i
        recover_row = list(matrix[j])
        del minor[j][col]
        matrix[j] = recover_row
    return minor

这是我用来保留原始矩阵的解决方案。你的代码在我寻找方法时帮了我很多!可以说,这正是使用for循环比嵌套的while循环要好得多的一个典型例子,哈哈。

3

当你执行 minor = matrix 这行代码时,其实并不是在创建一个矩阵的副本,而只是创建了一个新的指向这个矩阵的引用。也就是说,接下来如果你从 minor 中删除了一行,那么 matrix 中的那一行也会被删除。

你可以使用 copy.deepcopy,这个方法可能正是你需要的。

撰写回答