【问题标题】:Preserving dimensions when slicing symbolic block matrices in sympy在 sympy 中切片符号块矩阵时保留尺寸
【发布时间】:2017-03-24 22:54:22
【问题描述】:

我正在使用 sympy (python 3.6, sympy 1.0) 来促进数学证明中矩阵变换的计算。

为了计算舒尔补码,需要对由符号矩阵组成的块矩阵进行切片。

作为直接寻址矩阵:

    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, 1)M1 的形状不符,您可能需要查看M.shape,看看您是否也觉得它有误。
  • 我想你也许可以在M1 上再次调用BlockMatrix 来获得一个块矩阵,假设你仍然想要一个块矩阵。
  • M.shape 返回 (2*n, 2*n) 这是预期结果,因为 M 是 4 个 (2x2) 维度为 n 的矩阵的结果 BlockMatrix(M1) 返回正确的结果,可以你解释一下为什么?

标签: python matrix sympy


【解决方案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 x 1。所以你会得到一个 ImmutableMatrix,它有一个条目,Matrix([[Aj]])。如上所述,这个东西的形状是(1,1),因为没有识别块结构。

正如user2357112建议的那样,将块的切片输出转换为BlockMatrix会导致根据Aj的形状确定形状:

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

检查行为异常的对象类型通常很有用:例如,type(M1)type(M2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多