Skip to content

Commit bef9dfd

Browse files
committed
include any eligible tridiagonal matrix type, beyond real or complex
1 parent e54bf8a commit bef9dfd

File tree

3 files changed

+15
-2
lines changed

3 files changed

+15
-2
lines changed

src/special.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -605,8 +605,8 @@ function _hvcat(rows::Tuple{Vararg{Int}}, A::Union{AbstractArray,AbstractQ,Unifo
605605
end
606606
end
607607

608-
# factorizations
609-
function cholesky(S::RealHermSymComplexHerm{<:Real,<:SymTridiagonal}, ::NoPivot = NoPivot(); check::Bool = true)
608+
# tridiagonal cholesky factorization
609+
function cholesky(S::RealSymHermitian{<:BiTriSym}, ::NoPivot = NoPivot(); check::Bool = true)
610610
T = choltype(S)
611611
B = Bidiagonal{T}(diag(S, 0), diag(S, S.uplo == 'U' ? 1 : -1), sym_uplo(S.uplo))
612612
cholesky!(Hermitian(B, sym_uplo(S.uplo)), NoPivot(); check = check)

src/symmetric.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ const RealHermSymSymTri{T<:Real} = Union{RealHermSym{T}, SymTridiagonal{T}}
224224
const RealHermSymComplexHerm{T<:Real,S} = Union{Hermitian{T,S}, Symmetric{T,S}, Hermitian{Complex{T},S}}
225225
const RealHermSymComplexSym{T<:Real,S} = Union{Hermitian{T,S}, Symmetric{T,S}, Symmetric{Complex{T},S}}
226226
const RealHermSymSymTriComplexHerm{T<:Real} = Union{RealHermSymComplexSym{T}, SymTridiagonal{T}}
227+
const RealSymHermitian{S} = Union{Symmetric{<:Real,S}, Hermitian{<:Any,S}}
227228
const SelfAdjoint = Union{SymTridiagonal{<:Real}, Symmetric{<:Real}, Hermitian}
228229

229230
wrappertype(::Union{Symmetric, SymTridiagonal}) = Symmetric

test/cholesky.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,15 +493,27 @@ end
493493

494494
@testset "Cholesky for AbstractMatrix" begin
495495
for M in (SymTridiagonal(fill(2.0, 4), ones(3)),
496+
Symmetric(SymTridiagonal(fill(2.0, 4), ones(3)), :U),
497+
Symmetric(SymTridiagonal(fill(2.0, 4), ones(3)), :L),
496498
Tridiagonal(ones(3), fill(2.0, 4), ones(3)),
499+
Hermitian(Tridiagonal(ones(3), fill(2.0, 4), ones(3)), :U),
500+
Hermitian(Bidiagonal(fill(2.0, 4), ones(3), :U), :U),
501+
Hermitian(Bidiagonal(fill(2.0, 4), ones(3), :U), :L),
502+
Hermitian(Bidiagonal(fill(2.0, 4), ones(3), :L), :L),
497503
)
498504
C = cholesky(M)
499505
@test C.L * C.U M
506+
@test parent(C.U) isa Bidiagonal
500507
end
501508
# test LowerTriangular version
502509
M = Hermitian(Bidiagonal(fill(2.0, 4), im * ones(3), :L), :L)
503510
C = cholesky!(copy(M))
504511
@test C.L * C.U M
512+
# non-(RealOrComplex) eltype
513+
A = Tridiagonal(randn(Quaternion{Float64}, 4, 4) |> t -> t't)
514+
C = cholesky(A)
515+
@test C.L * C.U A
516+
@test parent(C.U) isa Bidiagonal
505517
end
506518

507519
@testset "constructor with non-BlasInt arguments" begin

0 commit comments

Comments
 (0)