我正在使用 sympy(python 3.6,sympy 1.0)来促进数学证明中矩阵变换的计算。
要计算 Schur 补码,必须对由符号矩阵组成的 block 矩阵进行切片。
作为直接寻址矩阵:
M[0:1,1]
不起作用我试过 sympy.matrices.expressions.blockmatrix.blocks 不幸的是 blocks 在处理一系列 block 时弄乱了矩阵的维度:
from sympy import *
n = Symbol('n')
Aj = MatrixSymbol('Aj', n,n)
M = BlockMatrix([[Aj, Aj],[Aj, Aj]])
M1 = M.blocks[0:1,0:1]
M2 = M.blocks[0,0]
print(M1.shape)
print(M2.shape)
M.blocks 为矩阵 M1 返回一个维度为 1,1 的矩阵,而矩阵 M2 的维度为 n,n。
关于如何在使用间隔时获得正确尺寸的任何建议?
最佳答案
blocks
方法返回一个 ImmutableMatrix 对象,而不是 BlockMatrix 对象。仅供引用:
def blocks(self):
from sympy.matrices.immutable import ImmutableMatrix
mats = self.args
data = [[mats[i] if i == j else ZeroMatrix(mats[i].rows, mats[j].cols)
for j in range(len(mats))]
for i in range(len(mats))]
return ImmutableMatrix(data)
ImmutableMatrix 对象的形状由它包含的符号数量决定;不考虑符号的结构。因此,您得到 (1,1)。
使用 M.blocks[0,0]
时,您可以访问矩阵的一个元素,即 Aj。这称为 MatrixSymbol,因此该形状按预期工作。
当使用 M.blocks[0:1, 0:1]
时,您对 SymPy 矩阵进行切片。切片总是返回一个子矩阵,即使切片的大小是 1 x 1。所以你得到一个只有一个条目的 ImmutableMatrix,Matrix([[Aj]])
。上面说了,这个东西的形状是(1,1),因为没有识别block结构。
正如 user2357112 所建议的,将 block 的切片输出转换为 BlockMatrix 会导致根据 Aj
的形状确定形状:
>>> M3 = BlockMatrix(M.blocks[0:, 0:1])
>>> M3.shape
(2*n, n)
检查行为异常的对象类型通常很有用:例如,type(M1)
和 type(M2)
。
关于python - 在 sympy 中切片符号 block 矩阵时保留维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43010422/