Python:创建不带numpy的逆矩阵



我正在使用pyomo,需要一个函数,在不使用numpy的情况下为我提供平方矩阵的逆矩阵。我已经在网上找到了一个功能,但找不到导致以下错误消息的问题:

操作数无法与形状(0,4((3,4(一起广播

def transposeMatrix(m):
return list(map(list,zip(*m)))
def getMatrixMinor(m,i,j):
return [row[:j] + row[j+1:] for row in (m[:i]+m[i+1:])]
def getMatrixDeternminant(m):
#base case for 2x2 matrix
if len(m) == 2:
return m[0][0]*m[1][1]-m[0][1]*m[1][0]
determinant = 0
for c in range(len(m)):
determinant += ((-1)**c)*m[0][c]*getMatrixDeternminant(getMatrixMinor(m,0,c))
return determinant
def getMatrixInverse(m):
determinant = getMatrixDeternminant(m)
#special case for 2x2 matrix:
if len(m) == 2:
return [[m[1][1]/determinant, -1*m[0][1]/determinant],
[-1*m[1][0]/determinant, m[0][0]/determinant]]
#find matrix of cofactors
cofactors = []
for r in range(len(m)):
cofactorRow = []
for c in range(len(m)):
minor = getMatrixMinor(m,r,c)
cofactorRow.append(((-1)**(r+c)) * getMatrixDeternminant(minor))
cofactors.append(cofactorRow)
cofactors = transposeMatrix(cofactors)
for r in range(len(cofactors)):
for c in range(len(cofactors)):
cofactors[r][c] = cofactors[r][c]/determinant
return cofactors

a = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [10, 4, 6, 2]])
getMatrixInverse(a)

如果我们去掉NumPy引用,只使用

a = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [10, 4, 6, 2]]

那么代码就工作了。然而,你的例子有一个零行列式,所以你在计算倒数时会得到一个除以零的误差。如果您使用类似矩阵的

a = [[ 0., 2.0, 3.0, 4.0 ], [ 5.0, 6.0, 7.0, 8. ],[ 9.0, 10.0, 11.0, 12.0 ], [ 13.,14.,15., 0. ]]

它的行列式是-64,那么你就得到了正确的逆

[[-1.0, 2.0, -1.0, 0.0], [2.0, -6.8125, 3.875, -0.0625], [-1.0, 4.625, -2.75, 0.125], [0.0, -0.0625, 0.125, -0.0625]]

最新更新