python - 在 sympy 中切片符号 block 矩阵时保留维度

标签 python matrix sympy

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

相关文章:

python - 如何根据Python中的条件用2级列替换数据框中的值?

python - 旋转子数据框

python - Python中两个列表的有序交集

python - 为什么 Sympy 会切断系数较小的多项式项?

python - iPython 笔记本中的 Sympy : printing an entire function

Python YouTube Gdata 播放器错误

java - 为什么有时位图是相同的对象?

OpenCV 向量到 Mat 但不是 element->row

python - 矩阵数组,使用 Python 中数组中的值构建

python - 估计 SymPy 函数的进度