@@ -1467,6 +1467,35 @@ function inv(B::Bidiagonal{T}) where T
14671467 return B. uplo == ' U' ? UpperTriangular (dest) : LowerTriangular (dest)
14681468end
14691469
1470+ # cholesky-version for (sym)tridiagonal matrices
1471+ for (T, uplo) in ((:UpperTriangular , :(:U )), (:LowerTriangular , :(:L )))
1472+ @eval function _chol! (A:: Bidiagonal , :: Type{$T} )
1473+ dv = real (A. dv)
1474+ ev = A. ev
1475+ n = length (dv)
1476+ @inbounds for i in 1 : n- 1
1477+ iszero (dv[i]) && throw (ZeroPivotException (i))
1478+ ev[i] /= dv[i]
1479+ dv[i+ 1 ] -= abs2 (ev[i])* dv[i]
1480+ Akk = dv[i]
1481+ Akk, info = _chol! (Akk, UpperTriangular)
1482+ if info != 0
1483+ return $ T (A), convert (BlasInt, i)
1484+ end
1485+ dv[i] = Akk
1486+ ev[i] *= dv[i]
1487+ end
1488+ Akk = dv[n]
1489+ Akk, info = _chol! (Akk, $ T)
1490+ if info != 0
1491+ return $ T (A), convert (BlasInt, n)
1492+ end
1493+ dv[n] = Akk
1494+ B = Bidiagonal (dv, ev, $ uplo)
1495+ return $ T (B), convert (BlasInt, 0 )
1496+ end
1497+ end
1498+
14701499# Eigensystems
14711500eigvals (M:: Bidiagonal ) = copy (M. dv)
14721501function eigvecs (M:: Bidiagonal{T} ) where T
@@ -1543,3 +1572,30 @@ function Base._sum(A::Bidiagonal, dims::Integer)
15431572 end
15441573 res
15451574end
1575+
1576+ function fillband! (B:: Bidiagonal , x, l, u)
1577+ if l > u
1578+ return B
1579+ end
1580+ if ((B. uplo == ' U' && (l < 0 || u > 1 )) ||
1581+ (B. uplo == ' L' && (l < - 1 || u > 0 ))) && ! iszero (x)
1582+ throw_fillband_error (l, u, x)
1583+ else
1584+ if B. uplo == ' U'
1585+ if l <= 1 <= u
1586+ fill! (B. ev, x)
1587+ end
1588+ if l <= 0 <= u
1589+ fill! (B. dv, x)
1590+ end
1591+ else # B.uplo == 'L'
1592+ if l <= 0 <= u
1593+ fill! (B. dv, x)
1594+ end
1595+ if l <= - 1 <= u
1596+ fill! (B. ev, x)
1597+ end
1598+ end
1599+ end
1600+ return B
1601+ end
0 commit comments