Structured matrices

# Structured Matrices

Structured matrices

## Requirements and Installation

See the instructions here. Then simply

```pip install backends-matrix
```

## Example

```>>> import lab as B

>>> from matrix import Diagonal

>>> d = Diagonal(B.rand(2, 3))  # A batch of diagonal marices

>>> d
<diagonal matrix: batch=(2,), shape=(3, 3), dtype=float64
diag=[[0.427 0.912 0.622]
[0.777 0.048 0.808]]>

>>> 2 * d
<diagonal matrix: batch=(2,), shape=(3, 3), dtype=float64
diag=[[0.854 1.824 1.243]
[1.553 0.096 1.616]]>

>>> 2 * d + 1
<Woodbury matrix: batch=(2,), shape=(3, 3), dtype=float64
diag=<diagonal matrix: batch=(2,), shape=(3, 3), dtype=float64
diag=[[0.854 1.824 1.243]
[1.553 0.096 1.616]]>
lr=<low-rank matrix: batch=(), shape=(3, 3), dtype=int64, rank=1
left=[

]
middle=<diagonal matrix: batch=(), shape=(1, 1), dtype=int64
diag=>>>

>>> B.inv(2 * d + 1)
<Woodbury matrix: batch=(2,), shape=(3, 3), dtype=float64
diag=<diagonal matrix: batch=(2,), shape=(3, 3), dtype=float64
diag=[[ 1.171  0.548  0.804]
[ 0.644 10.386  0.619]]>
lr=<low-rank matrix: batch=(2,), shape=(3, 3), dtype=float64, rank=1
left=<dense matrix: batch=(2,), shape=(3, 1), dtype=float64
mat=[[[ 1.171]
[ 0.548]
[ 0.804]]

[[ 0.644]
[10.386]
[ 0.619]]]>
middle=<dense matrix: batch=(2,), shape=(1, 1), dtype=float64
mat=[[[-0.284]]

[[-0.079]]]>
right=<dense matrix: batch=(2,), shape=(3, 1), dtype=float64
mat=[[[ 1.171]
[ 0.548]
[ 0.804]]

[[ 0.644]
[10.386]
[ 0.619]]]>>>

>>> B.inv(B.inv(2 * d + 1))
<Woodbury matrix: batch=(2,), shape=(3, 3), dtype=float64
diag=<diagonal matrix: batch=(2,), shape=(3, 3), dtype=float64
diag=[[0.854 1.824 1.243]
[1.553 0.096 1.616]]>
lr=<low-rank matrix: batch=(2,), shape=(3, 3), dtype=float64, rank=1
left=<dense matrix: batch=(2,), shape=(3, 1), dtype=float64
mat=[[[1.]
[1.]
[1.]]

[[1.]
[1.]
[1.]]]>
middle=<dense matrix: batch=(2,), shape=(1, 1), dtype=float64
mat=[[[1.]]

[[1.]]]>
right=<dense matrix: batch=(2,), shape=(3, 1), dtype=float64
mat=[[[1.]
[1.]
[1.]]

[[1.]
[1.]
[1.]]]>>>

>>> B.inv(B.inv(2 * d + 1)) - 1
<diagonal matrix: batch=(2,), shape=(3, 3), dtype=float64
diag=[[0.854 1.824 1.243]
[1.553 0.096 1.616]]>
```

## Matrix Types

All matrix types are subclasses of `AbstractMatrix`.

The following base types are provided:

``````Zero
Dense
Diagonal
Constant
LowerTriangular
UpperTriangular
``````

The following composite types are provided:

``````LowRank
Woodbury
Kronecker
TiledBlocks
``````

## Functions

The following functions are added to LAB. They can be accessed with `B.<function>` where `import lab as B`.

``````shape_broadcast(*elements)
shape_batch(a, *indices)
shape_matrix(a, *indices)

dense(a)
fill_diag(a, diag_len)
block(*rows)
block_diag(*blocks)

matmul_diag(a, b, tr_a=False, tr_b=False)

pd_inv(a)
schur(a)
pd_schur(a)
iqf(a, b, c)
iqf_diag(a, b, c)

ratio(a, c)
root(a)

sample(a, num=1)
``````

## Project details

This version 1.2.11 1.2.10 1.2.9 1.2.8 1.2.7 1.2.6 1.2.2 1.2.1 1.2.0 1.1.5 1.1.4 1.1.3 1.1.2 1.1.1 1.1.0 1.0.5 1.0.4 1.0.3 1.0.2 1.0.1 1.0.0 0.3.4 0.3.3 0.3.2 0.3.1 0.3.0 0.2.2 0.2.1 0.2.0 0.1.0

Uploaded `source`