在同情中切割符号块矩阵时保留尺寸

时间:2017-03-24 22:54:22

标签: python matrix sympy

我正在使用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。

任何建议如何在使用间隔时获得正确的尺寸?

1 个答案:

答案 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)