diff --git a/Project.toml b/Project.toml index 92d9a791..54543f90 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "LazyArrays" uuid = "5078a376-72f3-5289-bfd5-ec5146d43c02" -version = "2.2.4" +version = "2.2.5" [deps] ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" diff --git a/src/LazyArrays.jl b/src/LazyArrays.jl index 7b812493..8aa52a37 100644 --- a/src/LazyArrays.jl +++ b/src/LazyArrays.jl @@ -38,7 +38,8 @@ import ArrayLayouts: AbstractQLayout, Dot, Dotu, Ldiv, Lmul, MatMulMatAdd, MatMu hermitianlayout, layout_getindex, layout_replace_in_print_matrix, ldivaxes, materialize, materialize!, mulreduce, reshapedlayout, rowsupport, scalarone, scalarzero, sub_materialize, sublayout, symmetriclayout, symtridiagonallayout, transposelayout, triangulardata, - triangularlayout, tridiagonallayout, zero!, transtype, OnesLayout + triangularlayout, tridiagonallayout, zero!, transtype, OnesLayout, + diagonaldata, subdiagonaldata, supdiagonaldata import FillArrays: AbstractFill, getindex_value diff --git a/src/padded.jl b/src/padded.jl index fe71085a..340a55bf 100644 --- a/src/padded.jl +++ b/src/padded.jl @@ -589,3 +589,37 @@ PaddedArray(A::T, n::Vararg{Integer,N}) where {T<:Number,N} = ApplyArray{T,N}(se BroadcastStyle(::Type{<:PaddedArray{<:Any,N}}) where N = LazyArrayStyle{N}() + + + +function ArrayLayouts._bidiag_forwardsub!(M::Ldiv{<:Any,<:PaddedColumns}) + A, b_in = M.A, M.B + dv = diagonaldata(A) + ev = subdiagonaldata(A) + b = paddeddata(b_in) + N = length(b) + b[1] = bj1 = dv[1]\b[1] + @inbounds for j = 2:N + bj = b[j] + bj -= ev[j - 1] * bj1 + dvj = dv[j] + if iszero(dvj) + throw(SingularEbception(j)) + end + bj = dvj\bj + b[j] = bj1 = bj + end + + @inbounds for j = N+1:length(b_in) + iszero(bj1) && break + bj = -ev[j - 1] * bj1 + dvj = dv[j] + if iszero(dvj) + throw(SingularException(j)) + end + bj = dvj\bj + b_in[j] = bj1 = bj + end + + b_in +end \ No newline at end of file diff --git a/test/paddedtests.jl b/test/paddedtests.jl index ae505bce..09466edd 100644 --- a/test/paddedtests.jl +++ b/test/paddedtests.jl @@ -420,6 +420,12 @@ paddeddata(a::PaddedPadded) = a @test C'b ≈ Matrix(C)'b @test b'C ≈ b'Matrix(C) end + + @testset "Bidiagonal" begin + B = Bidiagonal(1:5, 1:4, :L) + b = Vcat(randn(5), Zeros(0)) + @test ArrayLayouts.ldiv!(B, deepcopy(b)) ≈ B\b + end end end # module