Skip to content

Commit e1cb2bc

Browse files
Use a copyto! approach in _BandedMatrix(::BandedRows, A), and switch to PermutedDimsArray in bandedrowsdata (#488)
* Use a copyto! approach, and switch to PermutedDimsArray * Fix for rectangular matrices * Remove Module prefix * Use size instead of sum * Use axes * Use Transpose for now * Change test --------- Co-authored-by: Sheehan Olver <[email protected]>
1 parent 84d8624 commit e1cb2bc

File tree

4 files changed

+22
-11
lines changed

4 files changed

+22
-11
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "BandedMatrices"
22
uuid = "aae01518-5342-5314-be14-df237901396f"
3-
version = "1.10.1"
3+
version = "1.10.2"
44

55
[deps]
66
ArrayLayouts = "4c555306-a7a7-4459-81d9-ec55ddd5c99a"

src/banded/BandedMatrix.jl

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -266,14 +266,21 @@ BandedMatrix(A::AbstractMatrix) = _BandedMatrix(MemoryLayout(A), A)
266266
_BandedMatrix(::BandedColumns, A::AbstractMatrix) = _BandedMatrix(copy(bandeddata(A)), axes(A,1), bandwidths(A)...)
267267
function _BandedMatrix(::BandedRows, A::AbstractMatrix)
268268
bdata = bandedrowsdata(A)
269-
m,ν = size(bdata)
270-
ℓ,u = bandwidths(A)
271-
data = similar(bdata, eltype(bdata), ν, size(A,2))
272-
n = size(A, 2)
273-
for j in axes(A, 1), i in max(1, j - ℓ):min(n, j + u)
274-
data[u + 1 + j - i, i] = bdata[j, ℓ+1+i-j]
269+
u, ℓ = bandwidths(A)
270+
m, n = size(A)
271+
data_new = similar(bdata, eltype(bdata), size(bdata, 2), n)
272+
for i in axes(bdata, 2)
273+
d = u + 1 - i
274+
row_new =+ 1 + d
275+
k_start = max(1, 1 - d)
276+
k_end = min(n, m - d)
277+
if k_start k_end
278+
col_start_A = k_start + d
279+
col_end_A = k_end + d
280+
copyto!(view(data_new, row_new, k_start:k_end), view(bdata, col_start_A:col_end_A, i))
281+
end
275282
end
276-
return _BandedMatrix(data, axes(A, 1), ℓ, u)
283+
return _BandedMatrix(data_new, axes(A, 1), u, ℓ)
277284
end
278285
function _BandedMatrix(::DiagonalLayout, A::AbstractMatrix{T}) where T
279286
m,n = size(A)

src/interfaceimpl.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,10 @@ function bandeddata(D::Union{Diagonal, Transpose{<:Any, <:Diagonal}, Adjoint{<:A
3030
permutedims(diagonaldata(D))
3131
end
3232

33-
bandedrowsdata(Ac::Transpose) = permutedims(bandeddata(parent(Ac)))
34-
bandedrowsdata(Ac::Adjoint{<:Real}) = permutedims(bandeddata(parent(Ac)))
35-
bandedrowsdata(V::SubArray) = permutedims(bandeddata(view(parent(parent(V)), reverse(parentindices(V))...)))
33+
#TODO: PermutedDimsArray(bandeddata(parent(Ac)), (2, 1))
34+
bandedrowsdata(Ac::Transpose{<:Number}) = Transpose(bandeddata(parent(Ac)))
35+
bandedrowsdata(Ac::Adjoint{<:Real}) = Transpose(bandeddata(parent(Ac)))
36+
bandedrowsdata(V::SubArray{<:Number}) = Transpose(bandeddata(view(parent(parent(V)), reverse(parentindices(V))...)))
3637

3738
# treat subinds as banded
3839
sublayout(::DiagonalLayout{L}, inds::Type) where L = sublayout(bandedcolumns(L()), inds)

test/test_banded.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,9 @@ include("mymatrix.jl")
620620
@test BandedMatrix(V) == V
621621
end
622622

623+
@test BandedMatrices.bandedrowsdata(A') isa Transpose
624+
@test BandedMatrices.bandedrowsdata(transpose(A)) isa Transpose
625+
@test BandedMatrices.bandedrowsdata(view(A', 1:2, 1:2)) isa Transpose
623626
end
624627
end
625628

0 commit comments

Comments
 (0)