在SymPy中从块矩阵构建矩阵

6
我希望得到一个类似于这样的矩阵:
import sympy as sp
sp.Matrix([[1,0,2,0],[0,1,0,2],[1,0,2,0],[0,1,0,2]])
# output
#⎡1  0  2  0⎤
#⎢          ⎥
#⎢0  1  0  2⎥
#⎢          ⎥
#⎢1  0  2  0⎥
#⎢          ⎥
#⎣0  1  0  2⎦

我想从块矩阵中构建一个新的矩阵:
s=sp.eye(2)
sp.Matrix([[s,2*s],[s,2*s]])
# output:
#⎡⎡1  0⎤  ⎡2  0⎤⎤
#⎢⎢    ⎥  ⎢    ⎥⎥
#⎢⎣0  1⎦  ⎣0  2⎦⎥
#⎢              ⎥
#⎢⎡1  0⎤  ⎡2  0⎤⎥
#⎢⎢    ⎥  ⎢    ⎥⎥
#⎣⎣0  1⎦  ⎣0  2⎦⎦

输出结果中有额外的括号。
解决办法之一是使用 sympy.functions.transpose 方法:
from sympy.functions import transpose
sp.Matrix([transpose(sp.Matrix([s*i for i in range(1,3)])) for j in range(1,3)])
# output 
#⎡1  0  2  0⎤
#⎢          ⎥
#⎢0  1  0  2⎥
#⎢          ⎥
#⎢1  0  2  0⎥
#⎢          ⎥
#⎣0  1  0  2⎦

这个解决方案相当繁琐。我想知道是否有更好的解决方案?

简而言之,如果矩阵在一维列表中,sp.Matrix方法似乎会将它们组合起来。

2个回答

9

使用TensorProduct

>>> from sympy import *
>>> from sympy.physics.quantum import TensorProduct
>>> A = ones(2,1) * Matrix([1,2]).T
>>> A
Matrix([
[1, 2],
[1, 2]])
>>> TensorProduct(A, eye(2))
Matrix([
[1, 0, 2, 0],
[0, 1, 0, 2],
[1, 0, 2, 0],
[0, 1, 0, 2]])

使用 BlockMatrix
>>> from sympy import *
>>> BlockMatrix([[eye(2), 2*eye(2)],[eye(2), 2*eye(2)]])
Matrix([
[Matrix([
[1, 0],
[0, 1]]), Matrix([
[2, 0],
[0, 2]])],
[Matrix([
[1, 0],
[0, 1]]), Matrix([
[2, 0],
[0, 2]])]])
>>> Matrix(BlockMatrix([[eye(2), 2*eye(2)],[eye(2), 2*eye(2)]]))
Matrix([
[1, 0, 2, 0],
[0, 1, 0, 2],
[1, 0, 2, 0],
[0, 1, 0, 2]])

2
我更喜欢第二个,因为有些块矩阵无法通过TensorProduct构建。 - Xiaoyu Liu

3

你还可以使用 hstackvstack 函数:


你可以使用 hstack 和 vstack 函数进行操作:
A = eye(2)
B = 2 * eye(2)
Matrix.vstack(
    Matrix.hstack(A, B),
    Matrix.hstack(A, B)
)

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