Skip to content

Commit e1de3fa

Browse files
jishnubkshyatt
authored andcommitted
Forward istriu/istril for triangular to parent (#55663)
1 parent 98591d0 commit e1de3fa

File tree

3 files changed

+52
-2
lines changed

3 files changed

+52
-2
lines changed

stdlib/LinearAlgebra/src/special.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,3 +586,7 @@ function cholesky(S::RealHermSymComplexHerm{<:Real,<:SymTridiagonal}, ::NoPivot
586586
B = Bidiagonal{T}(diag(S, 0), diag(S, S.uplo == 'U' ? 1 : -1), sym_uplo(S.uplo))
587587
cholesky!(Hermitian(B, sym_uplo(S.uplo)), NoPivot(); check = check)
588588
end
589+
590+
# istriu/istril for triangular wrappers of structured matrices
591+
_istril(A::LowerTriangular{<:Any, <:BandedMatrix}, k) = istril(parent(A), k)
592+
_istriu(A::UpperTriangular{<:Any, <:BandedMatrix}, k) = istriu(parent(A), k)

stdlib/LinearAlgebra/src/triangular.jl

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,14 +330,32 @@ function Base.replace_in_print_matrix(A::Union{LowerTriangular,UnitLowerTriangul
330330
return i >= j ? s : Base.replace_with_centered_mark(s)
331331
end
332332

333-
Base.@constprop :aggressive function istril(A::Union{LowerTriangular,UnitLowerTriangular}, k::Integer=0)
333+
istril(A::UnitLowerTriangular, k::Integer=0) = k >= 0
334+
istriu(A::UnitUpperTriangular, k::Integer=0) = k <= 0
335+
Base.@constprop :aggressive function istril(A::LowerTriangular, k::Integer=0)
334336
k >= 0 && return true
335337
return _istril(A, k)
336338
end
337-
Base.@constprop :aggressive function istriu(A::Union{UpperTriangular,UnitUpperTriangular}, k::Integer=0)
339+
@inline function _istril(A::LowerTriangular, k)
340+
P = parent(A)
341+
m = size(A, 1)
342+
for j in max(1, k + 2):m
343+
all(iszero, view(P, j:min(j - k - 1, m), j)) || return false
344+
end
345+
return true
346+
end
347+
Base.@constprop :aggressive function istriu(A::UpperTriangular, k::Integer=0)
338348
k <= 0 && return true
339349
return _istriu(A, k)
340350
end
351+
@inline function _istriu(A::UpperTriangular, k)
352+
P = parent(A)
353+
m = size(A, 1)
354+
for j in 1:min(m, m + k - 1)
355+
all(iszero, view(P, max(1, j - k + 1):j, j)) || return false
356+
end
357+
return true
358+
end
341359
istril(A::Adjoint, k::Integer=0) = istriu(A.parent, -k)
342360
istril(A::Transpose, k::Integer=0) = istriu(A.parent, -k)
343361
istriu(A::Adjoint, k::Integer=0) = istril(A.parent, -k)

stdlib/LinearAlgebra/test/triangular.jl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,4 +1226,32 @@ end
12261226
end
12271227
end
12281228

1229+
@testset "istriu/istril forwards to parent" begin
1230+
@testset "$(nameof(typeof(M)))" for M in [Tridiagonal(rand(n-1), rand(n), rand(n-1)),
1231+
Tridiagonal(zeros(n-1), zeros(n), zeros(n-1)),
1232+
Diagonal(randn(n)),
1233+
Diagonal(zeros(n)),
1234+
]
1235+
@testset for TriT in (UpperTriangular, UnitUpperTriangular, LowerTriangular, UnitLowerTriangular)
1236+
U = TriT(M)
1237+
A = Array(U)
1238+
for k in -n:n
1239+
@test istriu(U, k) == istriu(A, k)
1240+
@test istril(U, k) == istril(A, k)
1241+
end
1242+
end
1243+
end
1244+
z = zeros(n,n)
1245+
@testset for TriT in (UpperTriangular, UnitUpperTriangular, LowerTriangular, UnitLowerTriangular)
1246+
P = Matrix{BigFloat}(undef, n, n)
1247+
copytrito!(P, z, TriT <: Union{UpperTriangular, UnitUpperTriangular} ? 'U' : 'L')
1248+
U = TriT(P)
1249+
A = Array(U)
1250+
@testset for k in -n:n
1251+
@test istriu(U, k) == istriu(A, k)
1252+
@test istril(U, k) == istril(A, k)
1253+
end
1254+
end
1255+
end
1256+
12291257
end # module TestTriangular

0 commit comments

Comments
 (0)