使用 sympy 计算矩阵的伪逆

Kau*_*hik 5 python matrix sympy

我应该如何使用 sympy 计算矩阵的伪逆(不使用 numpy,因为矩阵具有符号常量,我希望逆也是符号)。法线inv()不适用于 sympy 中的非方阵。例如,如果M = Matrix(2,3, [1,2,3,4,5,6]), pinv(M)应该给

-0.9444   0.4444
-0.1111   0.1111
 0.7222  -0.2222
Run Code Online (Sandbox Code Playgroud)

Ery*_*Sun 5

我认为因为这都是象征性的,所以使用线性代数课中教授的教科书公式应该没问题(例如,请参阅维基百科关于摩尔-彭罗斯伪逆的文章中的特殊情况列表)。对于数值评估,请pinv改用奇异值分解 (svd)。

您有线性独立的行(全行排名),因此您可以使用“右”逆的公式:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

对于全列排名,将 M 替换为 MH,转置结果,并简化为“左”逆的以下公式:

>>> 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]
Run Code Online (Sandbox Code Playgroud)