diff --git a/src/triangular.jl b/src/triangular.jl index 199ff119..a7037e7e 100644 --- a/src/triangular.jl +++ b/src/triangular.jl @@ -376,6 +376,11 @@ istril(A::Transpose, k::Integer=0) = istriu(A.parent, -k) istriu(A::Adjoint, k::Integer=0) = istril(A.parent, -k) istriu(A::Transpose, k::Integer=0) = istril(A.parent, -k) +istril(U::UpperTriangular, k::Integer=0) = istril(parent(U), max(-1, k)) +istril(U::UnitUpperTriangular, k::Integer=0) = k < 0 ? false : istril(parent(U), k) +istriu(U::LowerTriangular, k::Integer=0) = istriu(parent(U), min(1, k)) +istriu(U::UnitLowerTriangular, k::Integer=0) = k > 0 ? false : istriu(parent(U), k) + function tril!(A::UpperTriangular{T}, k::Integer=0) where {T} if k < 0 fill!(A.data, zero(T)) diff --git a/test/triangular.jl b/test/triangular.jl index 739c3ff3..02c58df7 100644 --- a/test/triangular.jl +++ b/test/triangular.jl @@ -734,15 +734,16 @@ end end @testset "istriu/istril forwards to parent" begin - @testset "$(nameof(typeof(M)))" for M in [Tridiagonal(rand(n-1), rand(n), rand(n-1)), + @testset "$(nameof(typeof(M)))" for M in Any[Tridiagonal(rand(n-1), rand(n), rand(n-1)), Tridiagonal(zeros(n-1), zeros(n), zeros(n-1)), Diagonal(randn(n)), Diagonal(zeros(n)), + rand(n,n), zeros(n,n), diagm(1=>1:n-1), diagm(-2=>1:n-2), ] @testset for TriT in (UpperTriangular, UnitUpperTriangular, LowerTriangular, UnitLowerTriangular) U = TriT(M) A = Array(U) - for k in -n:n + @testset for k in -n:n @test istriu(U, k) == istriu(A, k) @test istril(U, k) == istril(A, k) end @@ -760,6 +761,19 @@ end end end + @testset "partly initialized in unit triangular" begin + for (T, f) in ((UnitUpperTriangular, istril), (UnitLowerTriangular, istriu)) + A = Matrix{BigFloat}(undef, 2, 2) + isupper = T === UnitUpperTriangular + A[1+!isupper, 1+isupper] = 3 + UU = T(A) + UUA = Array(UU) + for k in -size(A,1):size(A,2) + @test f(UU, k) == f(UUA, k) + end + end + end + @testset "Union eltype" begin M = Matrix{Union{Int,Missing}}(missing,2,2) U = triu(M)