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

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.

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 ]
```

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 ]
```

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 ]
```

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 ]
```

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 ]
```

09/17/2013

30 days ago

74 commits