使用sympy计算矩阵的伪逆

5

如何使用sympy计算矩阵的伪逆(不使用numpy,因为矩阵具有符号常量,我也希望反向操作在符号意义下)。在sympy中,对于��方阵矩阵,普通的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
1个回答

7
我认为由于这些都是象征性的,因此可以使用线性代数课程中教授的教科书公式(例如,在维基百科关于Moore-Penrose伪逆的特殊情况列表中查看)。对于数值计算,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]

为了得到完整的列秩,将 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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接