Skip to content

Commit 577f6a4

Browse files
committed
move methods
1 parent 57cb267 commit 577f6a4

File tree

2 files changed

+54
-52
lines changed

2 files changed

+54
-52
lines changed

src/bidiag.jl

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1467,6 +1467,60 @@ function inv(B::Bidiagonal{T}) where T
14671467
return B.uplo == 'U' ? UpperTriangular(dest) : LowerTriangular(dest)
14681468
end
14691469

1470+
# cholesky-version for (sym)tridiagonal matrices
1471+
function _chol!(A::Bidiagonal, ::Type{UpperTriangular})
1472+
require_one_based_indexing(A)
1473+
n = checksquare(A)
1474+
realdiag = eltype(A) <: Complex
1475+
dv = A.dv
1476+
ev = A.ev
1477+
@inbounds begin
1478+
for k = 1:n
1479+
Akk = realdiag ? real(dv[k]) : dv[k]
1480+
if k > 1
1481+
Akk -= realdiag ? abs2(ev[k-1]) : ev[k-1]'ev[k-1]
1482+
end
1483+
dv[k] = Akk
1484+
Akk, info = _chol!(Akk, UpperTriangular)
1485+
if info != 0
1486+
return UpperTriangular(A), convert(BlasInt, k)
1487+
end
1488+
dv[k] = Akk
1489+
AkkInv = inv(copy(Akk'))
1490+
if k < n
1491+
ev[k] = AkkInv*ev[k]
1492+
end
1493+
end
1494+
end
1495+
return UpperTriangular(A), convert(BlasInt, 0)
1496+
end
1497+
function _chol!(A::Bidiagonal, ::Type{LowerTriangular})
1498+
require_one_based_indexing(A)
1499+
n = checksquare(A)
1500+
realdiag = eltype(A) <: Complex
1501+
dv = A.dv
1502+
ev = A.ev
1503+
@inbounds begin
1504+
for k = 1:n
1505+
Akk = realdiag ? real(dv[k]) : dv[k]
1506+
if k > 1
1507+
Akk -= realdiag ? abs2(ev[k-1]) : ev[k-1]*ev[k-1]'
1508+
end
1509+
dv[k] = Akk
1510+
Akk, info = _chol!(Akk, LowerTriangular)
1511+
if info != 0
1512+
return LowerTriangular(A), convert(BlasInt, k)
1513+
end
1514+
dv[k] = Akk
1515+
AkkInv = inv(copy(Akk'))
1516+
if k < n
1517+
ev[k] *= AkkInv
1518+
end
1519+
end
1520+
end
1521+
return LowerTriangular(A), convert(BlasInt, 0)
1522+
end
1523+
14701524
# Eigensystems
14711525
eigvals(M::Bidiagonal) = copy(M.dv)
14721526
function eigvecs(M::Bidiagonal{T}) where T

src/cholesky.jl

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -220,32 +220,6 @@ function _chol!(A::AbstractMatrix, ::Type{UpperTriangular})
220220
end
221221
return UpperTriangular(A), convert(BlasInt, 0)
222222
end
223-
function _chol!(A::Bidiagonal, ::Type{UpperTriangular})
224-
require_one_based_indexing(A)
225-
n = checksquare(A)
226-
realdiag = eltype(A) <: Complex
227-
dv = A.dv
228-
ev = A.ev
229-
@inbounds begin
230-
for k = 1:n
231-
Akk = realdiag ? real(dv[k]) : dv[k]
232-
if k > 1
233-
Akk -= realdiag ? abs2(ev[k-1]) : ev[k-1]'ev[k-1]
234-
end
235-
dv[k] = Akk
236-
Akk, info = _chol!(Akk, UpperTriangular)
237-
if info != 0
238-
return UpperTriangular(A), convert(BlasInt, k)
239-
end
240-
dv[k] = Akk
241-
AkkInv = inv(copy(Akk'))
242-
if k < n
243-
ev[k] = AkkInv*ev[k]
244-
end
245-
end
246-
end
247-
return UpperTriangular(A), convert(BlasInt, 0)
248-
end
249223
function _chol!(A::AbstractMatrix, ::Type{LowerTriangular})
250224
require_one_based_indexing(A)
251225
n = checksquare(A)
@@ -276,32 +250,6 @@ function _chol!(A::AbstractMatrix, ::Type{LowerTriangular})
276250
end
277251
return LowerTriangular(A), convert(BlasInt, 0)
278252
end
279-
function _chol!(A::Bidiagonal, ::Type{LowerTriangular})
280-
require_one_based_indexing(A)
281-
n = checksquare(A)
282-
realdiag = eltype(A) <: Complex
283-
dv = A.dv
284-
ev = A.ev
285-
@inbounds begin
286-
for k = 1:n
287-
Akk = realdiag ? real(dv[k]) : dv[k]
288-
if k > 1
289-
Akk -= realdiag ? abs2(ev[k-1]) : ev[k-1]*ev[k-1]'
290-
end
291-
dv[k] = Akk
292-
Akk, info = _chol!(Akk, LowerTriangular)
293-
if info != 0
294-
return LowerTriangular(A), convert(BlasInt, k)
295-
end
296-
dv[k] = Akk
297-
AkkInv = inv(copy(Akk'))
298-
if k < n
299-
ev[k] *= AkkInv
300-
end
301-
end
302-
end
303-
return LowerTriangular(A), convert(BlasInt, 0)
304-
end
305253

306254
## Numbers
307255
function _chol!(x::Number, _)

0 commit comments

Comments
 (0)