# ToeplitzMatrices.jl

Fast matrix multiplication and division for Toeplitz, Hankel and circulant matrices in Julia

# Note

Multiplication of large matrices and `sqrt`

, `inv`

, `LinearAlgebra.eigvals`

,
`LinearAlgebra.ldiv!`

, and `LinearAlgebra.pinv`

for circulant matrices
are computed with FFTs.
To be able to use these methods, you have to install and load a package that implements
the AbstractFFTs.jl interface such
as FFTW.jl:

`using FFTW`

If you perform multiple calculations with FFTs, it can be more efficient to
initialize the required arrays and plan the FFT only once. You can precompute
the FFT factorization with `LinearAlgebra.factorize`

and then use the factorization
for the FFT-based computations.

# Supported matrices

## Toeplitz

A Toeplitz matrix has constant diagonals. It can be constructed using

`Toeplitz(vc,vr)`

where `vc`

are the entries in the first column and `vr`

are the entries in the first row, where `vc[1]`

must equal `vr[1]`

. For example.

`Toeplitz(1:3, [1.,4.,5.])`

is a sparse representation of the matrix

```
[ 1.0 4.0 5.0
2.0 1.0 4.0
3.0 2.0 1.0 ]
```

## SymmetricToeplitz

A symmetric Toeplitz matrix is a symmetric matrix with constant diagonals. It can be constructed with

`SymmetricToeplitz(vc)`

where `vc`

are the entries of the first column. For example,

`SymmetricToeplitz([1.0, 2.0, 3.0])`

is a sparse representation of the matrix

```
[ 1.0 2.0 3.0
2.0 1.0 2.0
3.0 2.0 1.0 ]
```

## TriangularToeplitz

A triangular Toeplitz matrix can be constructed using

`TriangularToeplitz(ve,uplo)`

where uplo is either `:L`

or `:U`

and `ve`

are the rows or columns, respectively. For example,

`TriangularToeplitz([1.,2.,3.],:L)`

is a sparse representation of the matrix

```
[ 1.0 0.0 0.0
2.0 1.0 0.0
3.0 2.0 1.0 ]
```

## Hankel

A Hankel matrix has constant anti-diagonals. It can be constructed using

`Hankel(vc,vr)`

where `vc`

are the entries in the first column and `vr`

are the entries in the last row, where `vc[end]`

must equal `vr[1]`

. For example.

`Hankel([1.,2.,3.], 3:5)`

is a sparse representation of the matrix

```
[ 1.0 2.0 3.0
2.0 3.0 4.0
3.0 4.0 5.0 ]
```

## Circulant

A circulant matrix is a special case of a Toeplitz matrix with periodic end conditions. It can be constructed using

`Circulant(vc)`

where `vc`

is a vector with the entries for the first column.
For example:

`Circulant([1.0, 2.0, 3.0])`

is a sparse representation of the matrix

```
[ 1.0 3.0 2.0
2.0 1.0 3.0
3.0 2.0 1.0 ]
```