# Block Diagonal Matrix¶

class fastmat.BlockDiag

Bases: fastmat.Matrix.Matrix

$M = \mathrm{diag}\left\{\left( A_{i}\right)_{i}\right\},$

where the $$A_{i}$$ can be fast transforms of *any* type.

>>> # import the package
>>> import fastmat as fm
>>>
>>> # define the blocks
>>> A = fm.Circulant(x_A)
>>> B = fm.Circulant(x_B)
>>> C = fm.Fourier(n)
>>> D = fm.Diag(x_D)
>>>
>>> # define the block
>>> # diagonal matrix
>>> M = fm.BlockDiag(A, B, C, D)


Assume we have two circulant matrices $$A$$ and $$B$$, an $$N$$-dimensional Fourier matrix $$C$$ and a diagonal matrix $$D$$. Then we define

$\begin{split}M = \begin{bmatrix} A & & & \\ & B & & \\ & & C & \\ & & & D \end{bmatrix}.\end{split}$

Meta types can also be nested, so that a block diagonal matrix can contain products of block matrices as its entries. Note that the efficiency of the fast transforms decreases the more building blocks they have.

>>> import fastmat as fm
>>> # import the package
>>>
>>> # define the blocks
>>> A = fm.Circulant(x_A)
>>> B = fm.Circulant(x_B)
>>> F = fm.Fourier(n)
>>> D = fm.Diag(x_D)
>>>
>>> # define a product
>>> P = fm.Product(A.H, B)
>>>
>>> # define the block
>>> # diagonal matrix
>>> M = fm.BlockDiag(P, F, D)


Assume we have a product $$P$$ of two matrices $$A^\mathrm{H}$$ and $$B$$, an $$N$$-dimensional Fourier matrix $${\mathcal{F}}$$ and a diagonal matrix $$D$$. Then we define

$\begin{split}M = \begin{bmatrix} A^\mathrm{H} \cdot B & & \\ & {\mathcal{F}} & \\ & & D \end{bmatrix}.\end{split}$

Todo

• BlockDiag should simply skip all Zero Matrices (flag them as “None”)?
__init__

Initialize a BlockDiag matrix instance.

Parameters: *matrices : fastmat.Matrix The matrix instances to be put along the main diagonal of the block diagonal matrix, beginning at index (0, 0) with the first matrix. **options : optional Additional keyworded arguments. Supports all optional arguments supported by fastmat.Matrix.