@@ -63,28 +63,42 @@ _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+ if iszero (view (A, diagind (A, - 1 )))
69+ Bidiagonal (A, :U )
70+ elseif iszero (view (A, diagind (A, 1 )))
71+ Bidiagonal (A, :L )
72+ else
73+ throw (InexactError (:Bidiagonal , A))
74+ end
75+ end
6676function copy (M:: Rmul{<:BidiagonalLayout,<:DiagonalLayout} )
67- A = convert (Bidiagonal, M. A)
77+ A = _bidiagonal ( M. A)
6878 _copy_diag (Rmul (A, M. B), M)
6979end
7080function copy (M:: Lmul{<:DiagonalLayout,<:BidiagonalLayout} )
71- B = convert (Bidiagonal, M. B)
81+ B = _bidiagonal ( M. B)
7282 _copy_diag (Lmul (M. A, B), M)
7383end
84+ _tridiagonal (A:: Tridiagonal ) = A
85+ _tridiagonal (A) = Tridiagonal (A)
7486function copy (M:: Rmul{<:TridiagonalLayout,<:DiagonalLayout} )
75- A = convert (Tridiagonal, M. A)
87+ A = _tridiagonal ( M. A)
7688 _copy_diag (Rmul (A, M. B), M)
7789end
7890function copy (M:: Lmul{<:DiagonalLayout,<:TridiagonalLayout} )
79- B = convert (Tridiagonal, M. B)
91+ B = _tridiagonal ( M. B)
8092 _copy_diag (Lmul (M. A, B), M)
8193end
94+ _symtridiagonal (A:: SymTridiagonal ) = A
95+ _symtridiagonal (A) = SymTridiagonal (A)
8296function copy (M:: Rmul{<:SymTridiagonalLayout,<:DiagonalLayout} )
83- A = convert (SymTridiagonal, M. A)
97+ A = _symtridiagonal ( M. A)
8498 _copy_diag (Rmul (A, M. B), M)
8599end
86100function copy (M:: Lmul{<:DiagonalLayout,<:SymTridiagonalLayout} )
87- B = convert (SymTridiagonal, M. B)
101+ B = _symtridiagonal ( M. B)
88102 _copy_diag (Lmul (M. A, B), M)
89103end
90104
0 commit comments