我正在编写一个程序,该程序可以在不显式依赖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 ]]
答案 0 :(得分:0)
刚刚意识到了代码的主要问题。在转置函数中,我称tempmat = mat会引起错误,因为它应该是tempmat = np.array(mat)