1

我正在尝试编写一个程序来查找 Python 3.3 中 NxN 矩阵的行列式,但它返回“列表索引超出范围”错误。det 函数中有一个调试打印语句,表明在给出的 2 x 2 矩阵示例的情况下,它适用于第一个未成年人,但随后 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))
4

3 回答 3

3

当您这样做时,minor = matrix您并没有创建矩阵的副本,而只是创建了对它的新引用。当您下一次从中删除一行时,minor您也会从 中删除该行matrix

copy.deepcopy可能会做你需要的。

于 2014-07-02T22:35:29.537 回答
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 循环好得多的主要情况哈哈

于 2018-03-09T21:42:25.337 回答
-1

我认为这里应该是“次要”而不是“矩阵”。

for b in list(range(len(matrix))): 
    #Delete column i
于 2016-06-13T02:13:30.197 回答