diff --git a/src/generic.jl b/src/generic.jl index c8336f87..83c2c1c8 100644 --- a/src/generic.jl +++ b/src/generic.jl @@ -1236,14 +1236,22 @@ function (\)(A::AbstractMatrix, B::AbstractVecOrMat) require_one_based_indexing(A, B) m, n = size(A) if m == n - if istril(A) - if istriu(A) - return Diagonal(A) \ B + istrium1 = istriu(A, -1) + istril1 = istril(A, 1) + if istril1 && iszero(diagview(A,1)) # istril(A) + if istrium1 + if iszero(diagview(A, -1)) + return Diagonal(A) \ B + end + return Bidiagonal(A, :L) \ B else return LowerTriangular(A) \ B end end - if istriu(A) + if istrium1 && iszero(diagview(A, -1)) # istriu(A) + if istril1 + return Bidiagonal(A, :U) \ B + end return UpperTriangular(A) \ B end return lu(A) \ B diff --git a/test/generic.jl b/test/generic.jl index 521beaf4..59760db0 100644 --- a/test/generic.jl +++ b/test/generic.jl @@ -937,4 +937,16 @@ end @test B == A2 end +@testset "linear solve for dense banded matrices" begin + b = randn(5) + for A in (diagm(0=>1:5, -1=>1:4, 1=>1:4), # SymTridiagonal + diagm(0=>1:5, -1=>1:4, 1=>5:8), # Tridiagonal + diagm(0=>1:5, 1=>1:4), # Upper Bidiagonal + diagm(0=>1:5, -1=>1:4), # Lower Bidiagonal + ) + x = A \ b + @test A * x ≈ b + end +end + end # module TestGeneric