From f0c6846f5d087875e8d2af263a51821c73d15871 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Galy-Fajou?= Date: Fri, 6 Sep 2019 13:00:51 +0200 Subject: [PATCH 1/3] Made AbstractPDMat <: AbstractMatrix and added needed getindex functions --- src/PDMats.jl | 2 +- src/pdiagmat.jl | 2 ++ src/pdmat.jl | 6 ++++-- src/pdsparsemat.jl | 3 ++- src/scalmat.jl | 2 ++ 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/PDMats.jl b/src/PDMats.jl index 0aa0fd1..2fb1405 100644 --- a/src/PDMats.jl +++ b/src/PDMats.jl @@ -37,7 +37,7 @@ module PDMats """ The base type for positive definite matrices. """ - abstract type AbstractPDMat{T<:Real} end + abstract type AbstractPDMat{T<:Real} <: AbstractMatrix{T} end const HAVE_CHOLMOD = isdefined(SuiteSparse, :CHOLMOD) diff --git a/src/pdiagmat.jl b/src/pdiagmat.jl index f5d7f2d..33ee5a4 100644 --- a/src/pdiagmat.jl +++ b/src/pdiagmat.jl @@ -27,6 +27,8 @@ dim(a::PDiagMat) = a.dim Base.Matrix(a::PDiagMat) = Matrix(Diagonal(a.diag)) LinearAlgebra.diag(a::PDiagMat) = copy(a.diag) LinearAlgebra.cholesky(a::PDiagMat) = cholesky(Diagonal(a.diag)) +Base.getindex(a::PDiagMat{T},i::Integer) where {T} = i%a.dim == (i÷a.dim+1) ? a.diag[i%a.dim] : zero(0) +Base.getindex(a::PDiagMat{T},i::Integer,j::Integer) where {T} = i == j ? a.diag[i] : zero(T) ### Arithmetics diff --git a/src/pdmat.jl b/src/pdmat.jl index 8205c20..37dd0aa 100644 --- a/src/pdmat.jl +++ b/src/pdmat.jl @@ -31,7 +31,8 @@ dim(a::PDMat) = a.dim Base.Matrix(a::PDMat) = copy(a.mat) LinearAlgebra.diag(a::PDMat) = diag(a.mat) LinearAlgebra.cholesky(a::PDMat) = a.chol - +Base.getindex(a::PDMat,i::Integer) = getindex(a.mat,i) +Base.getindex(a::PDMat,i::Integer,j::Integer) = getindex(a.mat,i,j) ### Arithmetics @@ -41,7 +42,8 @@ function pdadd!(r::Matrix, a::Matrix, b::PDMat, c) end *(a::PDMat{S}, c::T) where {S<:Real, T<:Real} = PDMat(a.mat * c) -*(a::PDMat, x::AbstractVecOrMat) = a.mat * x +*(a::PDMat, x::AbstractVector{T}) where {T} = a.mat * x +*(a::PDMat, x::AbstractMatrix{T}) where {T} = a.mat * x \(a::PDMat, x::AbstractVecOrMat) = a.chol \ x diff --git a/src/pdsparsemat.jl b/src/pdsparsemat.jl index cf5be98..388e3e8 100644 --- a/src/pdsparsemat.jl +++ b/src/pdsparsemat.jl @@ -31,7 +31,8 @@ dim(a::PDSparseMat) = a.dim Base.Matrix(a::PDSparseMat) = Matrix(a.mat) LinearAlgebra.diag(a::PDSparseMat) = diag(a.mat) LinearAlgebra.cholesky(a::PDSparseMat) = a.chol - +Base.getindex(a::PDSparseMat,i::Integer) = getindex(a.mat,i) +Base.getindex(a::PDSparseMat,i::Integer,j::Integer) = getindex(a.mat,i,j) ### Arithmetics diff --git a/src/scalmat.jl b/src/scalmat.jl index fa0f954..ab9863e 100644 --- a/src/scalmat.jl +++ b/src/scalmat.jl @@ -19,6 +19,8 @@ dim(a::ScalMat) = a.dim Base.Matrix(a::ScalMat) = Matrix(Diagonal(fill(a.value, a.dim))) LinearAlgebra.diag(a::ScalMat) = fill(a.value, a.dim) LinearAlgebra.cholesky(a::ScalMat) = cholesky(Diagonal(fill(a.value, a.dim))) +Base.getindex(a::ScalMat{T},i::Integer) where {T} = i%a.dim == (i÷a.dim+1) ? a.value : zero(T) +Base.getindex(a::ScalMat{T},i::Integer,j::Integer) where {T} = i == j ? a.value : zero(T) ### Arithmetics From 3d039befc58346aee6317ad9e695da68df5f93f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Galy-Fajou?= Date: Fri, 6 Sep 2019 13:05:52 +0200 Subject: [PATCH 2/3] Typo for zero(T) --- src/pdiagmat.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pdiagmat.jl b/src/pdiagmat.jl index 33ee5a4..167da02 100644 --- a/src/pdiagmat.jl +++ b/src/pdiagmat.jl @@ -27,7 +27,7 @@ dim(a::PDiagMat) = a.dim Base.Matrix(a::PDiagMat) = Matrix(Diagonal(a.diag)) LinearAlgebra.diag(a::PDiagMat) = copy(a.diag) LinearAlgebra.cholesky(a::PDiagMat) = cholesky(Diagonal(a.diag)) -Base.getindex(a::PDiagMat{T},i::Integer) where {T} = i%a.dim == (i÷a.dim+1) ? a.diag[i%a.dim] : zero(0) +Base.getindex(a::PDiagMat{T},i::Integer) where {T} = i%a.dim == (i÷a.dim+1) ? a.diag[i%a.dim] : zero(T) Base.getindex(a::PDiagMat{T},i::Integer,j::Integer) where {T} = i == j ? a.diag[i] : zero(T) ### Arithmetics From b479f24ad3dc3b6c2794d9ee2b15d1f2fb363032 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9o=20Galy-Fajou?= Date: Mon, 18 Nov 2019 13:01:13 +0100 Subject: [PATCH 3/3] Added size() for all objects --- src/pdiagmat.jl | 4 ++++ src/pdmat.jl | 8 ++++++-- src/pdsparsemat.jl | 4 ++++ src/scalmat.jl | 4 ++++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/pdiagmat.jl b/src/pdiagmat.jl index 167da02..a7f4325 100644 --- a/src/pdiagmat.jl +++ b/src/pdiagmat.jl @@ -27,6 +27,10 @@ dim(a::PDiagMat) = a.dim Base.Matrix(a::PDiagMat) = Matrix(Diagonal(a.diag)) LinearAlgebra.diag(a::PDiagMat) = copy(a.diag) LinearAlgebra.cholesky(a::PDiagMat) = cholesky(Diagonal(a.diag)) + +### Inheriting from AbstractMatrix + +Base.size(a::PDiagMat) = (a.dim,a.dim) Base.getindex(a::PDiagMat{T},i::Integer) where {T} = i%a.dim == (i÷a.dim+1) ? a.diag[i%a.dim] : zero(T) Base.getindex(a::PDiagMat{T},i::Integer,j::Integer) where {T} = i == j ? a.diag[i] : zero(T) diff --git a/src/pdmat.jl b/src/pdmat.jl index 37dd0aa..175615e 100644 --- a/src/pdmat.jl +++ b/src/pdmat.jl @@ -31,8 +31,12 @@ dim(a::PDMat) = a.dim Base.Matrix(a::PDMat) = copy(a.mat) LinearAlgebra.diag(a::PDMat) = diag(a.mat) LinearAlgebra.cholesky(a::PDMat) = a.chol -Base.getindex(a::PDMat,i::Integer) = getindex(a.mat,i) -Base.getindex(a::PDMat,i::Integer,j::Integer) = getindex(a.mat,i,j) + +### Inheriting from AbstractMatrix + +Base.size(a::PDMat) = size(a.mat) +Base.getindex(a::PDMat,i::Int) = getindex(a.mat,i) +Base.getindex(a::PDMat,i::Int,j::Int) = getindex(a.mat,i,j) ### Arithmetics diff --git a/src/pdsparsemat.jl b/src/pdsparsemat.jl index 388e3e8..17d955b 100644 --- a/src/pdsparsemat.jl +++ b/src/pdsparsemat.jl @@ -31,6 +31,10 @@ dim(a::PDSparseMat) = a.dim Base.Matrix(a::PDSparseMat) = Matrix(a.mat) LinearAlgebra.diag(a::PDSparseMat) = diag(a.mat) LinearAlgebra.cholesky(a::PDSparseMat) = a.chol + +### Inheriting from AbstractMatrix + +Base.size(a::PDSparseMat) = (a.dim,a.dim) Base.getindex(a::PDSparseMat,i::Integer) = getindex(a.mat,i) Base.getindex(a::PDSparseMat,i::Integer,j::Integer) = getindex(a.mat,i,j) diff --git a/src/scalmat.jl b/src/scalmat.jl index ab9863e..cf2221b 100644 --- a/src/scalmat.jl +++ b/src/scalmat.jl @@ -19,6 +19,10 @@ dim(a::ScalMat) = a.dim Base.Matrix(a::ScalMat) = Matrix(Diagonal(fill(a.value, a.dim))) LinearAlgebra.diag(a::ScalMat) = fill(a.value, a.dim) LinearAlgebra.cholesky(a::ScalMat) = cholesky(Diagonal(fill(a.value, a.dim))) + +### Inheriting from AbstractMatrix + +Base.size(a::ScalMat) = (a.dim,a.dim) Base.getindex(a::ScalMat{T},i::Integer) where {T} = i%a.dim == (i÷a.dim+1) ? a.value : zero(T) Base.getindex(a::ScalMat{T},i::Integer,j::Integer) where {T} = i == j ? a.value : zero(T)