Skip to content

Commit 77bfc17

Browse files
committed
Forward to copyto!
1 parent 9b14073 commit 77bfc17

File tree

1 file changed

+30
-6
lines changed

1 file changed

+30
-6
lines changed

src/diagonal.jl

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,36 @@ copy(M::Rdiv{<:DiagonalLayout,<:DiagonalLayout{<:AbstractFillLayout}}) = diagona
5757

5858

5959
## 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
6690

6791
copy(M::Lmul{DiagonalLayout{OnesLayout}}) = _copy_oftype(M.B, eltype(M))
6892
copy(M::Lmul{DiagonalLayout{OnesLayout},<:DiagonalLayout}) = Diagonal(_copy_oftype(diagonaldata(M.B), eltype(M)))

0 commit comments

Comments
 (0)