Special Matrices
Contents
9.2. Special Matrices¶
using LinearAlgebra
The 2D arrays seen so far have been general, that is, that can be used to represent arbitrary matrices. Many applications lead to matrices with special structures or properties, and Julia defines a number of specialized matrix representations for this. The main reason for using these is to obtain better performance (which can make a very big difference), but they are also useful to e.g. ensure correctness of codes by enforcing known properties.
Type 
Description 

Symmetric 

Hermitian 

UpperTriangular 
Upper triangular matrix 
UnitUpperTriangular 
Upper triangular matrix with unit diagonal 
LowerTriangular 
Lower triangular matrix 
UnitLowerTriangular 
Lower triangular matrix with unit diagonal 
Tridiagonal 

SymTridiagonal 
Symmetric tridiagonal matrix 
Bidiagonal 
Upper/lower bidiagonal matrix 
Diagonal 

UniformScaling 
For example, if you know that your matrix is both symmetric and tridiagonal, you can use the SymTridiagonal
type. The example below shows how to generate a famous matrix which is very common in applications:
T = SymTridiagonal(2ones(5), ones(4))
5×5 SymTridiagonal{Float64, Vector{Float64}}:
2.0 1.0 ⋅ ⋅ ⋅
1.0 2.0 1.0 ⋅ ⋅
⋅ 1.0 2.0 1.0 ⋅
⋅ ⋅ 1.0 2.0 1.0
⋅ ⋅ ⋅ 1.0 2.0
The matrix operations defined above will work just as before on these specialized types, but likely be much more efficient. For example:
T * randn(5) # Matrixvector multiplication
T^3 # Matrix cube
5×5 SparseArrays.SparseMatrixCSC{Float64, Int64} with 23 stored entries:
14.0 14.0 6.0 1.0 ⋅
14.0 20.0 15.0 6.0 1.0
6.0 15.0 20.0 15.0 6.0
1.0 6.0 15.0 20.0 14.0
⋅ 1.0 6.0 14.0 14.0
9.2.1. The identity matrix¶
The identity matrix \(I\) is so commonly used, that it has a special syntax which supports some additional performance improvements. In its simplest form, you can simply use the I
operator and it will behave as expected:
T + 2I # OK, since T is 3by3
5×5 SymTridiagonal{Float64, Vector{Float64}}:
4.0 1.0 ⋅ ⋅ ⋅
1.0 4.0 1.0 ⋅ ⋅
⋅ 1.0 4.0 1.0 ⋅
⋅ ⋅ 1.0 4.0 1.0
⋅ ⋅ ⋅ 1.0 4.0
If you want to actually create an identity matrix, you have to specify the element type and the dimensions:
I4 = Matrix{Float64}(I, 4, 4)
4×4 Matrix{Float64}:
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
but this is often not necessary since the I
operator can be used in expressions, as shown above.