@@ -63,28 +63,47 @@ _similar(A::SymTridiagonal) = similar(Tridiagonal(A.ev, A.dv, A.ev))
63
63
_copy_diag (M:: T , :: T ) where {T<: Rmul } = copyto! (_similar (M. A), M)
64
64
_copy_diag (M:: T , :: T ) where {T<: Lmul } = copyto! (_similar (M. B), M)
65
65
_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
66
77
function copy (M:: Rmul{<:BidiagonalLayout,<:DiagonalLayout} )
67
- A = convert (Bidiagonal, M. A)
78
+ A = _bidiagonal ( M. A)
68
79
_copy_diag (Rmul (A, M. B), M)
69
80
end
70
81
function copy (M:: Lmul{<:DiagonalLayout,<:BidiagonalLayout} )
71
- B = convert (Bidiagonal, M. B)
82
+ B = _bidiagonal ( M. B)
72
83
_copy_diag (Lmul (M. A, B), M)
73
84
end
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)
74
89
function copy (M:: Rmul{<:TridiagonalLayout,<:DiagonalLayout} )
75
- A = convert (Tridiagonal, M. A)
90
+ A = _tridiagonal ( M. A)
76
91
_copy_diag (Rmul (A, M. B), M)
77
92
end
78
93
function copy (M:: Lmul{<:DiagonalLayout,<:TridiagonalLayout} )
79
- B = convert (Tridiagonal, M. B)
94
+ B = _tridiagonal ( M. B)
80
95
_copy_diag (Lmul (M. A, B), M)
81
96
end
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)
82
101
function copy (M:: Rmul{<:SymTridiagonalLayout,<:DiagonalLayout} )
83
- A = convert (SymTridiagonal, M. A)
102
+ A = _symtridiagonal ( M. A)
84
103
_copy_diag (Rmul (A, M. B), M)
85
104
end
86
105
function copy (M:: Lmul{<:DiagonalLayout,<:SymTridiagonalLayout} )
87
- B = convert (SymTridiagonal, M. B)
106
+ B = _symtridiagonal ( M. B)
88
107
_copy_diag (Lmul (M. A, B), M)
89
108
end
90
109
0 commit comments