diff --git a/.github/workflows/downstream.yml b/.github/workflows/downstream.yml index 3a74ef1f..5e471f8b 100644 --- a/.github/workflows/downstream.yml +++ b/.github/workflows/downstream.yml @@ -44,6 +44,7 @@ jobs: - {repo: ApproxFunBase.jl, group: JuliaApproximation} - {repo: ApproxFun.jl, group: JuliaApproximation} - {repo: InfiniteLinearAlgebra.jl, group: JuliaLinearAlgebra} + - {repo: ClassicalOrthogonalPolynomials.jl, group: JuliaApproximation} steps: - uses: actions/checkout@v5 diff --git a/Project.toml b/Project.toml index 8b65b742..3a125161 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "BandedMatrices" uuid = "aae01518-5342-5314-be14-df237901396f" -version = "1.10.0" +version = "1.10.1" [deps] ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a" diff --git a/src/banded/BandedMatrix.jl b/src/banded/BandedMatrix.jl index fbe02300..25b72a05 100644 --- a/src/banded/BandedMatrix.jl +++ b/src/banded/BandedMatrix.jl @@ -266,13 +266,14 @@ BandedMatrix(A::AbstractMatrix) = _BandedMatrix(MemoryLayout(A), A) _BandedMatrix(::BandedColumns, A::AbstractMatrix) = _BandedMatrix(copy(bandeddata(A)), axes(A,1), bandwidths(A)...) function _BandedMatrix(::BandedRows, A::AbstractMatrix) bdata = bandedrowsdata(A) - data = similar(bdata, eltype(bdata), reverse(size(bdata))) - u, ℓ = bandwidths(A) + m,ν = size(bdata) + ℓ,u = bandwidths(A) + data = similar(bdata, eltype(bdata), ν, size(A,2)) n = size(A, 2) - for j in axes(A, 1), i in max(1, j - u):min(n, j + ℓ) - data[ℓ + 1 + j - i, i] = bdata[j, u+1+i-j] + for j in axes(A, 1), i in max(1, j - ℓ):min(n, j + u) + data[u + 1 + j - i, i] = bdata[j, ℓ+1+i-j] end - return _BandedMatrix(data, axes(A, 1), bandwidths(A)...) + return _BandedMatrix(data, axes(A, 1), ℓ, u) end function _BandedMatrix(::DiagonalLayout, A::AbstractMatrix{T}) where T m,n = size(A) diff --git a/src/interfaceimpl.jl b/src/interfaceimpl.jl index 36fc54da..6f54d624 100644 --- a/src/interfaceimpl.jl +++ b/src/interfaceimpl.jl @@ -32,6 +32,7 @@ end bandedrowsdata(Ac::Transpose) = permutedims(bandeddata(parent(Ac))) bandedrowsdata(Ac::Adjoint{<:Real}) = permutedims(bandeddata(parent(Ac))) +bandedrowsdata(V::SubArray) = permutedims(bandeddata(view(parent(parent(V)), reverse(parentindices(V))...))) # treat subinds as banded sublayout(::DiagonalLayout{L}, inds::Type) where L = sublayout(bandedcolumns(L()), inds) diff --git a/test/test_banded.jl b/test/test_banded.jl index 7c11dbb7..84b259b2 100644 --- a/test/test_banded.jl +++ b/test/test_banded.jl @@ -608,7 +608,18 @@ include("mymatrix.jl") @test BandedMatrix(B) == B @test BandedMatrix(B) !== B @test BandedMatrices.bandeddata(BandedMatrix(B)) !== BandedMatrices.bandeddata(A) + + @test BandedMatrix(view(B,2:4, 3:5)) == B[2:4,3:5] == [B[k,j] for k=2:4,j=3:5] + end + + for V in (view(BandedMatrix((1 => ones(4),), (10, 10))', 1:5, 1:4), + view(BandedMatrix((1 => ones(4),), (10, 10))', 1:3, 1:5), + view(BandedMatrix((-1 => ones(4),), (10, 10))', 1:5, 1:4), + view(BandedMatrix((-1 => ones(4),), (10, 10))', 1:3, 1:5), + view(BandedMatrix((-1 => ones(4), 1 => ones(9)), (10, 10))', 1:3, 1:5)) + @test BandedMatrix(V) == V end + end end