python中的矩阵求逆:底部对角线总是错误的

时间:2019-02-07 14:50:14

标签: python numpy matrix inversion

我正在编写一个程序,该程序可以在不显式依赖numpy.linalg.inv函数的情况下反转n * n维的方矩阵,但是左下方的三角矩阵始终不正确,而其余矩阵元素始终正确。我已经多次梳理代码,但无法弄清楚为什么左下三角矩阵是唯一不正确的部分。

我已经多次重写了该程序,并试图隔离每个部分以查看其是否达到了预期的目的,但是我无法确定哪里出了问题。

import numpy as np
from numpy import delete as npd

def Main():
    mat = np.array(([1,2,5],
                    [4,1,1],
                    [1,2,3]))
    print("Original Matrix")
    print(mat)
    print("Inverted Matrix")
    print(Invert(mat))
    print("Correct Matrix")
    print(np.linalg.inv(mat))

def Invert(mat):
    det = Determinant(mat)
    if(len(mat) == 2):
        smolMat = mat  # Matrix to hold all the smaller values
        smolMat[0][0], smolMat[1][1] = mat[1][1]/det, mat[0][0]/det
        smolMat[1][0], smolMat[0][1] = -mat[1][0]/det, -mat[0][1]/det
        return smolMat
    coMat = np.zeros((len(mat), len(mat)))
    for i in range(0, len(mat)):
        for j in range(0, len(mat)):
            minMat = Minor(mat, i, j)
            coMat[i][j] = (((-1)**(i+j)) * Determinant(minMat))
    return TransAndCo(coMat, det)

def Determinant(mat):
    if(len(mat) == 2):
        return ((mat[0][0] * mat[1][1]) - (mat[0][1] * mat[1][0]))
    det = 0
    for i in range(0, len(mat)):
        det += ((-1) ** i) * mat[0][i] * Determinant(Minor(mat, 0, i))
    return det

def Minor(mat, i, j):
    return npd(npd(mat,i,0),j,1)

def TransAndCo(mat, det):
    tempMat = mat
    for i in range(0, len(mat)):
        for j in range(0, len(mat)):
            tempMat[i][j] = mat[j][i]/det
    return tempMat

Main()

在这种情况下,预期输出是

[[ 0.07142857  0.28571429 -0.21428571]
 [ 0.02040816 -0.14285714  1.35714286]
 [-0.01530612  0.09693878 -0.5       ]]

但是正确倒置的矩阵是:

[[ 0.07142857  0.28571429 -0.21428571]
 [-0.78571429 -0.14285714  1.35714286]
 [ 0.5        -0.         -0.5       ]]

1 个答案:

答案 0 :(得分:0)

刚刚意识到了代码的主要问题。在转置函数中,我称tempmat = mat会引起错误,因为它应该是tempmat = np.array(mat)