Skip to content

Commit dfdf436

Browse files
authored
Specialize istriu/istril/isdiag using bandwidths (#358)
* specialize istriu/istril/isdiag using bandwidths * bump version to v0.17.23
1 parent 9c9323d commit dfdf436

File tree

4 files changed

+81
-2
lines changed

4 files changed

+81
-2
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 = "0.17.22"
3+
version = "0.17.23"
44

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

src/BandedMatrices.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import LinearAlgebra: axpy!, _chol!, rot180, dot, cholcopy, _apply_ipiv_rows!,
1919
_apply_inverse_ipiv_rows!, diag, eigvals!, eigvals, eigen!, eigen,
2020
qr, qr!, ldiv!, mul!, lu, lu!, ldlt, ldlt!,
2121
kron, lmul!, rmul!, factorize, logabsdet,
22-
svdvals, svdvals!, tril!, triu!, diagzero
22+
svdvals, svdvals!, tril!, triu!, diagzero, istriu, istril, isdiag
2323

2424
using LinearAlgebra.LAPACK
2525
using LinearAlgebra.LAPACK: chkuplo, chktrans

src/generic/AbstractBandedMatrix.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,19 @@ function triu!(A::AbstractBandedMatrix{T}, k::Integer) where T
139139
A
140140
end
141141

142+
function isdiag(B::AbstractBandedMatrix)
143+
l, u = bandwidths(B)
144+
l + u < 0 || (iszero(l) && iszero(u))
145+
end
146+
function istriu(B::AbstractBandedMatrix, k::Integer)
147+
l, u = bandwidths(B)
148+
l + u < 0 || min(l, size(B,1)-1) <= -k
149+
end
150+
function istril(B::AbstractBandedMatrix, k::Integer)
151+
l, u = bandwidths(B)
152+
l + u < 0 || min(u, size(B,2)-1) <= k
153+
end
154+
142155

143156
## @inbands
144157

test/test_linalg.jl

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,5 +360,71 @@ import BandedMatrices: BandedColumns, _BandedMatrix
360360
end
361361
end
362362
end
363+
364+
@testset "isdiag/istril/istriu" begin
365+
@testset "no bands" begin
366+
B = brand(3,2,-2,1)
367+
for k in -5:5
368+
@test istriu(B, k)
369+
@test istril(B, k)
370+
@test isdiag(B)
371+
end
372+
end
373+
374+
@testset "one band" begin
375+
B = brand(3,3,-1,1)
376+
A = Array(B)
377+
@test !isdiag(B)
378+
@test all(k -> istril(B,k), 1:5)
379+
@test all(k -> !istril(B,k), -5:0)
380+
@test all(k -> istriu(B,k), -5:1)
381+
@test all(k -> !istriu(B,k), 2:5)
382+
@test all(k -> istriu(A,k) == istriu(B,k), -5:5)
383+
@test all(k -> istril(A,k) == istril(B,k), -5:5)
384+
385+
B = brand(3,3,1,-1)
386+
A = Array(B)
387+
@test !isdiag(B)
388+
@test all(k -> istril(B,k), -1:5)
389+
@test all(k -> !istril(B,k), -5:-2)
390+
@test all(k -> istriu(B,k), -5:-1)
391+
@test all(k -> !istriu(B,k), 0:5)
392+
@test all(k -> istriu(A,k) == istriu(B,k), -5:5)
393+
@test all(k -> istril(A,k) == istril(B,k), -5:5)
394+
395+
B = brand(3,3,0,0)
396+
A = Array(B)
397+
@test isdiag(B)
398+
@test all(k -> istril(B,k), 0:5)
399+
@test all(k -> !istril(B,k), -5:-1)
400+
@test all(k -> istriu(B,k), -5:0)
401+
@test all(k -> !istriu(B,k), 1:5)
402+
@test all(k -> istriu(A,k) == istriu(B,k), -5:5)
403+
@test all(k -> istril(A,k) == istril(B,k), -5:5)
404+
end
405+
406+
@testset "multiple bands" begin
407+
B = brand(3,6,1,2)
408+
A = Array(B)
409+
@test !isdiag(B)
410+
@test all(k -> istril(B,k), 2:5)
411+
@test all(k -> !istril(B,k), -5:1)
412+
@test all(k -> istriu(B,k), -5:-1)
413+
@test all(k -> !istriu(B,k), 0:-5)
414+
@test all(k -> istriu(A,k) == istriu(B,k), -5:5)
415+
@test all(k -> istril(A,k) == istril(B,k), -5:5)
416+
417+
for B in (brand(3,3,3,3), brand(3,3,2,2), brand(3,3,4,4))
418+
A = Array(B)
419+
@test !isdiag(B)
420+
@test all(k -> istril(B,k), 2:5)
421+
@test all(k -> !istril(B,k), -5:1)
422+
@test all(k -> istriu(B,k), -5:-2)
423+
@test all(k -> !istriu(B,k), -1:-5)
424+
@test all(k -> istriu(A,k) == istriu(B,k), -5:5)
425+
@test all(k -> istril(A,k) == istril(B,k), -5:5)
426+
end
427+
end
428+
end
363429
end
364430

0 commit comments

Comments
 (0)