我应该如何使用sympy计算矩阵的伪逆(不使用numpy,因为矩阵具有符号常数,我也想要符号中的逆) . 正常 inv() 对于sympy中的非方矩阵不起作用 . 例如,如果 M = Matrix(2,3, [1,2,3,4,5,6]), pinv(M) 应该给
inv()
M = Matrix(2,3, [1,2,3,4,5,6]), pinv(M)
-0.9444 0.4444 -0.1111 0.1111 0.7222 -0.2222
我认为,因为这是象征性的,所以可以使用线性代数类中教授的文本书公式(例如,参见Moore–Penrose pseudoinverse上维基百科文章中的特殊情况列表) . 对于数值评估, pinv 使用奇异值分解(svd)代替 .
pinv
您具有线性独立的行(完整行级),因此您可以将公式用于“右”逆:
>>> import sympy as sy >>> M = sy.Matrix(2,3, [1,2,3,4,5,6]) >>> N = M.H * (M * M.H) ** -1 >>> N.evalf(4) [-0.9444, 0.4444] [-0.1111, 0.1111] [ 0.7222, -0.2222] >>> M * N [1, 0] [0, 1]
对于完整列排名,将M替换为M.H,转置结果,并简化以获得“左”逆的以下公式:
>>> M = sy.Matrix(3, 2, [1,2,3,4,5,6]) >>> N = (M.H * M) ** -1 * M.H >>> N.evalf(4) [-1.333, -0.3333, 0.6667] [ 1.083, 0.3333, -0.4167] >>> N * M [1, 0] [0, 1]
1 回答
我认为,因为这是象征性的,所以可以使用线性代数类中教授的文本书公式(例如,参见Moore–Penrose pseudoinverse上维基百科文章中的特殊情况列表) . 对于数值评估,
pinv
使用奇异值分解(svd)代替 .您具有线性独立的行(完整行级),因此您可以将公式用于“右”逆:
对于完整列排名,将M替换为M.H,转置结果,并简化以获得“左”逆的以下公式: