如何使用sympy(伪逆挂起)部分反转非方矩阵?

2024-03-29 08:59:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图部分反转非方矩阵M:V->;在这个意义上,对于某个基向量v,没有其他向量映射到Mv,我想找到一个矩阵N,使得NMv=v。我之所以说部分反转,是因为可能还有其他线性无关的向量x,y,使得Mx=My

我一直在使用Symphy以编程方式实现这一点,我发现实现这一点的唯一方法是使用伪逆函数.pinv()。然而,这个函数挂起在一个我想要(伪)反转的特定矩阵上——我不确定这是一个bug还是矩阵太大

然而,Sympy可以使用运行非常快的.rref()函数将M简化为行梯队形式。能够提取行操作(或初等矩阵)是很好的,因为它们可以很容易地进行反转以得到所需的结果。是否有某种方法可以从.rref()函数(它也返回枢轴)中获取基本矩阵?有没有其他与.pinv()无关的方法来获得我想要的结果


Tags: 方法函数gtmy编程线性矩阵向量
1条回答
网友
1楼 · 发布于 2024-03-29 08:59:49

我猜你的意思是这样的:

In [32]: x, y = symbols('x, y')

In [33]: M = Matrix([[1, 1], [0, 1], [0, 0]])

In [34]: xy = Matrix([x, y])

In [35]: XY = Matrix([-1, 1])

In [36]: M
Out[36]: 
Matrix([
[1, 1],
[0, 1],
[0, 0]])

In [37]: M*xy
Out[37]: 
Matrix([
[x + y],
[    y],
[    0]])

In [38]: solve(Eq(M*xy, M*XY), [x, y])
Out[38]: {x: -1, y: 1}

通过形成增广矩阵并使用rref,可以找到矩阵:

In [39]: Matrix.hstack(M, eye(3)).rref()
Out[39]: 
⎛⎡1  0  1  -1  0⎤           ⎞
⎜⎢              ⎥           ⎟
⎜⎢0  1  0  1   0⎥, (0, 1, 4)⎟
⎜⎢              ⎥           ⎟
⎝⎣0  0  0  0   1⎦           ⎠

In [40]: Matrix.hstack(M, eye(3)).rref()[0][:2,2:]
Out[40]: 
Matrix([
[1, -1, 0],
[0,  1, 0]])

In [41]: M.pinv()
Out[41]: 
Matrix([
[1, -1, 0],
[0,  1, 0]])

相关问题 更多 >