@@ -57,12 +57,36 @@ copy(M::Rdiv{<:DiagonalLayout,<:DiagonalLayout{<:AbstractFillLayout}}) = diagona
57
57
58
58
59
59
# # bi/tridiagonal copy
60
- copy (M:: Rmul{<:BidiagonalLayout,<:DiagonalLayout} ) = convert (Bidiagonal, M. A) .* permutedims (parent (convert (Diagonal, M. B)))
61
- copy (M:: Lmul{<:DiagonalLayout,<:BidiagonalLayout} ) = parent (convert (Diagonal, M. A)) .* convert (Bidiagonal, M. B)
62
- copy (M:: Rmul{<:TridiagonalLayout,<:DiagonalLayout} ) = convert (Tridiagonal, M. A) .* permutedims (parent (convert (Diagonal, M. B)))
63
- copy (M:: Lmul{<:DiagonalLayout,<:TridiagonalLayout} ) = parent (convert (Diagonal, M. A)) .* convert (Tridiagonal, M. B)
64
- copy (M:: Rmul{<:SymTridiagonalLayout,<:DiagonalLayout} ) = convert (SymTridiagonal, M. A) .* permutedims (parent (convert (Diagonal, M. B)))
65
- copy (M:: Lmul{<:DiagonalLayout,<:SymTridiagonalLayout} ) = parent (convert (Diagonal, M. A)) .* convert (SymTridiagonal, M. B)
60
+ # hack around the fact that a SymTridiagonal isn't fully mutable
61
+ _similar (A) = similar (A)
62
+ _similar (A:: SymTridiagonal ) = similar (Tridiagonal (A. ev, A. dv, A. ev))
63
+ _copy_diag (M:: T , :: T ) where {T<: Rmul } = copyto! (_similar (M. A), M)
64
+ _copy_diag (M:: T , :: T ) where {T<: Lmul } = copyto! (_similar (M. B), M)
65
+ _copy_diag (M, _) = copy (M)
66
+ function copy (M:: Rmul{<:BidiagonalLayout,<:DiagonalLayout} )
67
+ A = convert (Bidiagonal, M. A)
68
+ _copy_diag (Rmul (A, M. B), M)
69
+ end
70
+ function copy (M:: Lmul{<:DiagonalLayout,<:BidiagonalLayout} )
71
+ B = convert (Bidiagonal, M. B)
72
+ _copy_diag (Lmul (M. A, B), M)
73
+ end
74
+ function copy (M:: Rmul{<:TridiagonalLayout,<:DiagonalLayout} )
75
+ A = convert (Tridiagonal, M. A)
76
+ _copy_diag (Rmul (A, M. B), M)
77
+ end
78
+ function copy (M:: Lmul{<:DiagonalLayout,<:TridiagonalLayout} )
79
+ B = convert (Tridiagonal, M. B)
80
+ _copy_diag (Lmul (M. A, B), M)
81
+ end
82
+ function copy (M:: Rmul{<:SymTridiagonalLayout,<:DiagonalLayout} )
83
+ A = convert (SymTridiagonal, M. A)
84
+ _copy_diag (Rmul (A, M. B), M)
85
+ end
86
+ function copy (M:: Lmul{<:DiagonalLayout,<:SymTridiagonalLayout} )
87
+ B = convert (SymTridiagonal, M. B)
88
+ _copy_diag (Lmul (M. A, B), M)
89
+ end
66
90
67
91
copy (M:: Lmul{DiagonalLayout{OnesLayout}} ) = _copy_oftype (M. B, eltype (M))
68
92
copy (M:: Lmul{DiagonalLayout{OnesLayout},<:DiagonalLayout} ) = Diagonal (_copy_oftype (diagonaldata (M. B), eltype (M)))
0 commit comments