(B)
Flatten a BlockMatrix of BlockMatrices
Flatten a BlockMatrix of BlockMatrices
Flatten a BlockMatrix of BlockMatrices
def deblock(B):
    """ Flatten a BlockMatrix of BlockMatrices """
    if not isinstance(B, BlockMatrix) or not B.blocks.has(BlockMatrix):
        return B
    wrap = lambda x: x if isinstance(x, BlockMatrix) else BlockMatrix([[x]])
    bb = B.blocks.applyfunc(wrap)  # everything is a block

    from sympy import Matrix
    try:
        MM = Matrix(0, sum(bb[0, i].blocks.shape[1] for i in range(bb.shape[1])), [])
        for row in range(0, bb.shape[0]):
            M = Matrix(bb[row, 0].blocks)
            for col in range(1, bb.shape[1]):
                M = M.row_join(bb[row, col].blocks)
            MM = MM.col_join(M)

        return BlockMatrix(MM)
    except ShapeError:
        return B
def deblock ( B ) : if not isinstance ( B , BlockMatrix ) or not B . blocks . has ( BlockMatrix ) : return B wrap = lambda x : x if isinstance ( x , BlockMatrix ) else BlockMatrix ( [ [ x ] ] ) bb = B . blocks . applyfunc ( wrap ) # everything is a block from sympy import Matrix try : MM = Matrix ( 0 , sum ( bb [ 0 , i ] . blocks . shape [ 1 ] for i in range ( bb . shape [ 1 ] ) ) , [ ] ) for row in range ( 0 , bb . shape [ 0 ] ) : M = Matrix ( bb [ row , 0 ] . blocks ) for col in range ( 1 , bb . shape [ 1 ] ) : M = M . row_join ( bb [ row , col ] . blocks ) MM = MM . col_join ( M ) return BlockMatrix ( MM ) except ShapeError : return B