Skip to content

Commit 897c8a7

Browse files
committed
Fix banded-diagonal Lmul/Rmul copy
1 parent 96b1c5d commit 897c8a7

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ArrayLayouts"
22
uuid = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"
33
authors = ["Sheehan Olver <[email protected]>"]
4-
version = "1.11.0"
4+
version = "1.11.1"
55

66
[deps]
77
FillArrays = "1a297f60-69ca-5386-bcde-b61e274b549b"

src/diagonal.jl

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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
6676
function copy(M::Rmul{<:BidiagonalLayout,<:DiagonalLayout})
67-
A = convert(Bidiagonal, M.A)
77+
A = _bidiagonal(M.A)
6878
_copy_diag(Rmul(A, M.B), M)
6979
end
7080
function copy(M::Lmul{<:DiagonalLayout,<:BidiagonalLayout})
71-
B = convert(Bidiagonal, M.B)
81+
B = _bidiagonal(M.B)
7282
_copy_diag(Lmul(M.A, B), M)
7383
end
84+
_tridiagonal(A::Tridiagonal) = A
85+
_tridiagonal(A) = Tridiagonal(A)
7486
function copy(M::Rmul{<:TridiagonalLayout,<:DiagonalLayout})
75-
A = convert(Tridiagonal, M.A)
87+
A = _tridiagonal(M.A)
7688
_copy_diag(Rmul(A, M.B), M)
7789
end
7890
function copy(M::Lmul{<:DiagonalLayout,<:TridiagonalLayout})
79-
B = convert(Tridiagonal, M.B)
91+
B = _tridiagonal(M.B)
8092
_copy_diag(Lmul(M.A, B), M)
8193
end
94+
_symtridiagonal(A::SymTridiagonal) = A
95+
_symtridiagonal(A) = SymTridiagonal(A)
8296
function copy(M::Rmul{<:SymTridiagonalLayout,<:DiagonalLayout})
83-
A = convert(SymTridiagonal, M.A)
97+
A = _symtridiagonal(M.A)
8498
_copy_diag(Rmul(A, M.B), M)
8599
end
86100
function copy(M::Lmul{<:DiagonalLayout,<:SymTridiagonalLayout})
87-
B = convert(SymTridiagonal, M.B)
101+
B = _symtridiagonal(M.B)
88102
_copy_diag(Lmul(M.A, B), M)
89103
end
90104

0 commit comments

Comments
 (0)