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

How do I partially invert a non-square matrix using sympy (pseudo-inverse hangs up)?

我正在尝试部分反转非方阵 M:V->W 在某种意义上,对于某个基本向量 v \in V 使得没有其他向量映射到 Mv,我想要找到满足 NMv = v 的矩阵 N。我说部分反转是因为可能存在其他线性无关向量 x, y 使得 Mx = My.

我一直在使用 sympy 以编程方式执行此操作,我发现执行此操作的唯一方法是使用伪逆函数 .pinv()。但是,此函数挂在我想要(伪)反转的特定矩阵上——我不确定这是一个错误还是矩阵太大。

但是,

Sympy 可以使用运行速度非常快的 .rref() 函数将 M 简化为行梯形。能够提取行操作(或初等矩阵)会很好,因为它们可以很容易地反转以获得所需的结果。有什么方法可以从 .rref() 函数(也是 returns 枢轴)中获取初等矩阵吗?是否有另一种与 .pinv() 无关的方法来获得我想要的结果?

我猜你的意思是这样的:

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]])