问题描述
我正在使用 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,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,2]])
getMatrixInverse(a)
解决方法
如果我们去掉 NumPy 引用而直接使用
a = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[10,4,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,-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]]