## QuasiTriangular.jl

Author DynareJulia
Popularity
0 Stars
Updated Last
1 Year Ago
Started In
December 2021

# QuasiTriangular

A Julia package for quasi upper triangular matrices strongly inspired by https://github.com/JuliaLang/julia/blob/master/stdlib/LinearAlgebra/src/triangular.jl

WORK IN PROGRESS

Type `QuasiUpperTriangular` stores a quasi upper triangular matrix in a square matrix. The various algorithms ignore the lower zero elements

## Functions

### Matrix - vector product

• `A_mul_B!(a::QuasiUpperTriangular,b::AbstractVector,work::AbstractVector)` uses BLAS `trmv` and corrects the results for lower nonzero elements. For small matrices, (n < 27), uses regular matrix - vector product
• `A_mul_B!(A::QuasiUpperTriangular, B::AbstractVector)` pure Julia implementation. Doesn't need extra workspace.

### Vector - matrix produc

• `A_mul_B!(A::AbstractVector, B::QuasiUpperTriangular)` pure Julia implementation. Doesn't need extra workspace.

### Transposed matrix -vector product

• `At_mul_B!(A::QuasiUpperTriangular, B::AbstractVector)` pure Julia implementation. Doesn't need extra workspace.

### Vector - transposed matrix product

• `A_mul_Bt!(A::AbstractVector, B::QuasiUpperTriangular)` pure Julia implementation. Doesn't need extra workspace.

### Matrix - matrix product

• `A_mul_B!(C::AbstractMatrix, A::QuasiUpperTriangular, B::AbstractMatrix)`: `C = A*B`, `A` is quasi upper triangular
• `A_mul_B!(C::AbstractMatrix, A::QuasiUpperTriangular, b::AbstractMatrix)`: `C = αA*B`, `A` is quasi upper triangular
• `At_mul_B!(C::AbstractMatrix, A::QuasiUpperTriangular, B::AbstractMatrix)`: `C = transpose(A)*B`, `A` is quasi upper triangular
• `At_mul_B!(C::AbstractMatrix, A::QuasiUpperTriangular, b::AbstractMatrix)`: `C = α*transpose(A)*B`, `A` is quasi upper triangular
• `At_mul_B!(A::QuasiUpperTriangular, B::AbstractMatrix)` `B = transpose(A)*B` in place computation, `A` is quasi upper triangular.
• `A_mul_B!(C::AbstractMatrix, A::AbstractMatrix, B::QuasiUpperTriangular)`: `C = A*B`, `B` is quasi upper triangular.
• `A_mul_B!(A::AbstractMatrix, B::QuasiUpperTriangular)`: `C = A*B`, in place computation, `B` is quasi upper triangular.
• `A_mul_Bt!(C::AbstractMatrix, A::AbstractMatrix, B::QuasiUpperTriangular)`: `C = A*transpose(B)`, `B` is quasi upper triangular.
• `A_mul_Bt!(A::AbstractMatrix, B::QuasiUpperTriangular)`: `C = A*transpose(B)`, in place computation, `B` is quasi upper triangular.
• `A_mul_B!(C:QuasiUpperTriangular, A::QuasiUpperTriangular, B::QuasiUpperTriangular)`, `A`, `B` and `C` are quasi upper triangular.

### Linear problem solver

• `A_ldiv_B!(A::QuasiUpperTriangular, B::AbstractMatrix)` solves `A*X = B`, where `A` is quasi upper triangular. Solves by back substitution. Lower off-diagonal elements make 2 * 2 problems that are solved explicitely.
• `A_rdiv_B!(A::AbstractMatrix, B::QuasiUpperTriangular)` solves `X*B = A`, where `B` is quasi upper triangular. Solves by back substitution. Lower off-diagonal elements make 2 * 2 problems that are solved explicitely.
• `A_rdiv_Bt!(A::AbstractMatrix, B::QuasiUpperTriangular)` solves `X*transpose(B) = A`, where `B` is quasi upper triangular. Solves by back substitution. Lower off-diagonal elements make 2 * 2 problems that are solved explicitely.
• `I_plus_rA_ldiv_B!(r::Float64,a::QuasiUpperTriangular, b::AbstractVector)` solves `(I + r*A)*x = b` where `A` is quasi upper triangular.

## TODO

• replace function names for product by `mul!`
• introduce lazy transpose evaluation
• handle quasi lower triangular matrices
• benchmark cases that have two different implementations

### Required Packages

No packages found.