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)
 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 ) 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
flatten a blockmatrix of blockmatrices .