Skip to content

Commit cfaedee

Browse files
committed
add a LAPACK call path
1 parent bf09d41 commit cfaedee

File tree

2 files changed

+26
-8
lines changed

2 files changed

+26
-8
lines changed

src/bidiag.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1468,6 +1468,15 @@ function inv(B::Bidiagonal{T}) where T
14681468
end
14691469

14701470
# cholesky-version for (sym)tridiagonal matrices
1471+
function _chol!(A::Bidiagonal{<:BlasFloat,<:StridedVector}, ::Type{UpperTriangular})
1472+
d = real(A.dv)
1473+
e = A.ev
1474+
dv, ev = LAPACK.pttrf!(d, e)
1475+
map!(sqrt, dv)
1476+
@views ev .*= dv[1:end-1]
1477+
U = Bidiagonal(dv, ev, :U)
1478+
return UpperTriangular(U), convert(BlasInt, 0)
1479+
end
14711480
function _chol!(A::Bidiagonal, ::Type{UpperTriangular})
14721481
require_one_based_indexing(A)
14731482
n = checksquare(A)
@@ -1494,6 +1503,15 @@ function _chol!(A::Bidiagonal, ::Type{UpperTriangular})
14941503
end
14951504
return UpperTriangular(A), convert(BlasInt, 0)
14961505
end
1506+
function _chol!(A::Bidiagonal{<:BlasFloat,<:StridedVector}, ::Type{LowerTriangular})
1507+
d = real(A.dv)
1508+
e = A.ev
1509+
dv, ev = LAPACK.pttrf!(d, e)
1510+
map!(sqrt, dv)
1511+
@views ev .*= dv[1:end-1]
1512+
L = Bidiagonal(dv, ev, :L)
1513+
return LowerTriangular(L), convert(BlasInt, 0)
1514+
end
14971515
function _chol!(A::Bidiagonal, ::Type{LowerTriangular})
14981516
require_one_based_indexing(A)
14991517
n = checksquare(A)

test/cholesky.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -492,14 +492,14 @@ end
492492
end
493493

494494
@testset "Cholesky for AbstractMatrix" begin
495-
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),
498-
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),
495+
for T in (identity, big), M in (SymTridiagonal(fill(T(2.0), 4), ones(3)),
496+
Symmetric(SymTridiagonal(fill(T(2.0), 4), ones(3)), :U),
497+
Symmetric(SymTridiagonal(fill(T(2.0), 4), ones(3)), :L),
498+
Tridiagonal(ones(3), fill(T(2.0), 4), ones(3)),
499+
Hermitian(Tridiagonal(ones(3), fill(T(2.0), 4), ones(3)), :U),
500+
Hermitian(Bidiagonal(fill(T(2.0), 4), ones(3), :U), :U),
501+
Hermitian(Bidiagonal(fill(T(2.0), 4), ones(3), :U), :L),
502+
Hermitian(Bidiagonal(fill(T(2.0), 4), ones(3), :L), :L),
503503
)
504504
C = cholesky(M)
505505
@test C.L * C.U M

0 commit comments

Comments
 (0)