sympy中符号块矩阵切片时的保维数问题

2024-04-28 05:39:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用sympy(python3.6,sympy1.0)来简化数学证明中矩阵变换的计算。你知道吗

为了计算Schur补,需要对由符号矩阵组成的块矩阵进行切片。你知道吗

直接对矩阵进行寻址:

    M[0:1,1]

不起作用,我试过同构矩阵表达式.blockmatrix.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

在使用区间时,有没有关于如何获得正确尺寸的建议?你知道吗


Tags: 证明符号切片矩阵数学printsympyshape
1条回答
网友
1楼 · 发布于 2024-04-28 05:39:17

方法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]时,您可以切片一个symphy矩阵。切片总是返回一个子矩阵,即使切片的大小是1乘1。所以你得到一个带有一个条目的不可变矩阵,Matrix([[Aj]])。如上所述,这个东西的形状是(1,1),因为没有块结构的识别。你知道吗

正如user2357112所建议的,将块的切片输出转换为块矩阵导致基于Aj的形状来确定形状:

>>> M3 = BlockMatrix(M.blocks[0:, 0:1])
>>> M3.shape
(2*n, n)  

检查以意外方式运行的对象的类型通常很有用:例如type(M1)type(M2)。你知道吗

相关问题 更多 >