@@ -63,28 +63,47 @@ _similar(A::SymTridiagonal) = similar(Tridiagonal(A.ev, A.dv, A.ev))
6363_copy_diag (M:: T , :: T ) where {T<: Rmul } = copyto! (_similar (M. A), M)
6464_copy_diag (M:: T , :: T ) where {T<: Lmul } = copyto! (_similar (M. B), M)
6565_copy_diag (M, _) = copy (M)
66+ _bidiagonal (A:: Bidiagonal ) = A
67+ function _bidiagonal (A)
68+ # we assume that the matrix is indeed bidiagonal,
69+ # so that the conversion is lossless
70+ if iszero (view (A, diagind (A, - 1 )))
71+ uplo = :U
72+ else
73+ uplo = :L
74+ end
75+ Bidiagonal (A, uplo)
76+ end
6677function copy (M:: Rmul{<:BidiagonalLayout,<:DiagonalLayout} )
67- A = convert (Bidiagonal, M. A)
78+ A = _bidiagonal ( M. A)
6879 _copy_diag (Rmul (A, M. B), M)
6980end
7081function copy (M:: Lmul{<:DiagonalLayout,<:BidiagonalLayout} )
71- B = convert (Bidiagonal, M. B)
82+ B = _bidiagonal ( M. B)
7283 _copy_diag (Lmul (M. A, B), M)
7384end
85+ # we assume that the matrix is indeed tridiagonal,
86+ # so that the conversion is lossless
87+ _tridiagonal (A:: Tridiagonal ) = A
88+ _tridiagonal (A) = Tridiagonal (A)
7489function copy (M:: Rmul{<:TridiagonalLayout,<:DiagonalLayout} )
75- A = convert (Tridiagonal, M. A)
90+ A = _tridiagonal ( M. A)
7691 _copy_diag (Rmul (A, M. B), M)
7792end
7893function copy (M:: Lmul{<:DiagonalLayout,<:TridiagonalLayout} )
79- B = convert (Tridiagonal, M. B)
94+ B = _tridiagonal ( M. B)
8095 _copy_diag (Lmul (M. A, B), M)
8196end
97+ # we assume that the matrix is indeed symmetric tridiagonal,
98+ # so that the conversion is lossless
99+ _symtridiagonal (A:: SymTridiagonal ) = A
100+ _symtridiagonal (A) = SymTridiagonal (A)
82101function copy (M:: Rmul{<:SymTridiagonalLayout,<:DiagonalLayout} )
83- A = convert (SymTridiagonal, M. A)
102+ A = _symtridiagonal ( M. A)
84103 _copy_diag (Rmul (A, M. B), M)
85104end
86105function copy (M:: Lmul{<:DiagonalLayout,<:SymTridiagonalLayout} )
87- B = convert (SymTridiagonal, M. B)
106+ B = _symtridiagonal ( M. B)
88107 _copy_diag (Lmul (M. A, B), M)
89108end
90109
0 commit comments