首页 文章

找到作为列表列表输入的N×N矩阵的行列式 - “列表索引超出范围”

提问于
浏览
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))

3 回答

  • -1

    当你做 minor = matrix 时,你不仅仅是创建一个新的引用 . 当您下次从 minor 删除一行时,您还要从 matrix 删除该行 .

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

  • 3
    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循环haha好得多

  • 1

    我认为不是“矩阵”,而应该是“次要的” .

    for b in list(range(len(matrix))): 
        #Delete column i
    

相关问题