我正在使用sympy(python 3.6,sympy 1.0)来促进数学证明中矩阵变换的计算。
要计算Schur补码,必须对由符号矩阵组成的块矩阵进行切片。
直接用矩阵寻址矩阵:
M[0:1,1]
无效我试过 sympy.matrices.expressions.blockmatrix.blocks 不幸的是, blocks 在处理一系列块时搞乱了矩阵的维度:
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。
任何建议如何在使用间隔时获得正确的尺寸?
答案 0 :(得分:1)
方法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乘1.所以你得到一个带有一个条目{ImmationMatrix的Matrix([[Aj]])
。如上所述,由于没有识别出块结构,因此该物的形状为(1,1)。
正如user2357112建议的那样,将切片的块输出转换为BlockMatrix会导致形状根据Aj
的形状确定:
>>> M3 = BlockMatrix(M.blocks[0:, 0:1])
>>> M3.shape
(2*n, n)
检查以意外方式行事的对象类型通常很有用:例如type(M1)
和type(M2)
。