如何使用 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]])
我正在尝试部分反转非方阵 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]])