From b7f0c03e49d54a686c5f5766d84f0b2674c60aac Mon Sep 17 00:00:00 2001 From: Jim Garrison Date: Thu, 23 Apr 2015 20:44:41 -0700 Subject: [PATCH] Fix #10739, implement `isdiag` method --- base/exports.jl | 1 + base/linalg.jl | 1 + base/linalg/generic.jl | 3 +++ doc/stdlib/linalg.rst | 4 ++++ test/arrayops.jl | 11 +++++++++++ test/linalg/bidiag.jl | 4 ++-- test/linalg/triangular.jl | 6 +++++- 7 files changed, 27 insertions(+), 3 deletions(-) diff --git a/base/exports.jl b/base/exports.jl index 98d358a445aec..73d9ed60eeec2 100644 --- a/base/exports.jl +++ b/base/exports.jl @@ -634,6 +634,7 @@ export givens, hessfact!, hessfact, + isdiag, ishermitian, isposdef!, isposdef, diff --git a/base/linalg.jl b/base/linalg.jl index 54c9ca18c10f6..69b370a61a234 100644 --- a/base/linalg.jl +++ b/base/linalg.jl @@ -69,6 +69,7 @@ export gradient, hessfact, hessfact!, + isdiag, ishermitian, isposdef, isposdef!, diff --git a/base/linalg/generic.jl b/base/linalg/generic.jl index cf8ab0ecd9c24..31b09a13d7749 100644 --- a/base/linalg/generic.jl +++ b/base/linalg/generic.jl @@ -308,8 +308,11 @@ function istril(A::AbstractMatrix) return true end +isdiag(A::AbstractMatrix) = istril(A) && istriu(A) + istriu(x::Number) = true istril(x::Number) = true +isdiag(x::Number) = true linreg{T<:Number}(X::StridedVecOrMat{T}, y::Vector{T}) = [ones(T, size(X,1)) X] \ y diff --git a/doc/stdlib/linalg.rst b/doc/stdlib/linalg.rst index 667b049048232..4a981534c233f 100644 --- a/doc/stdlib/linalg.rst +++ b/doc/stdlib/linalg.rst @@ -630,6 +630,10 @@ Linear algebra functions in Julia are largely implemented by calling functions f Test whether a matrix is upper triangular. +.. function:: isdiag(A) -> Bool + + Test whether a matrix is diagonal. + .. function:: ishermitian(A) -> Bool Test whether a matrix is Hermitian. diff --git a/test/arrayops.jl b/test/arrayops.jl index 3beab3105d8cd..e6a9dfce6ed93 100644 --- a/test/arrayops.jl +++ b/test/arrayops.jl @@ -806,6 +806,17 @@ end @test_throws ArgumentError flipdim(1:10, -1) @test isequal(flipdim(Array(Int,0,0),1), Array(Int,0,0)) # issue #5872 +# isdiag, istril, istriu +@test isdiag(3) +@test istril(4) +@test istriu(5) +@test !isdiag([1 2; 3 4]) +@test !istril([1 2; 3 4]) +@test !istriu([1 2; 3 4]) +@test isdiag([1 0; 0 4]) +@test istril([1 0; 3 4]) +@test istriu([1 2; 0 4]) + # issue 4228 A = [[i i; i i] for i=1:2] @test cumsum(A) == Any[[1 1; 1 1], [3 3; 3 3]] diff --git a/test/linalg/bidiag.jl b/test/linalg/bidiag.jl index d1854805a9310..57e884c350481 100644 --- a/test/linalg/bidiag.jl +++ b/test/linalg/bidiag.jl @@ -78,8 +78,8 @@ for relty in (Float32, Float64, BigFloat), elty in (relty, Complex{relty}) end end -#Issue 10742 +# Issue 10742 and similar let A = Bidiagonal([1,2,3], [0,0], true) @test istril(A) + @test isdiag(A) end - diff --git a/test/linalg/triangular.jl b/test/linalg/triangular.jl index cd5fffdaf5cc6..5ead78671e276 100644 --- a/test/linalg/triangular.jl +++ b/test/linalg/triangular.jl @@ -275,6 +275,10 @@ for eltya in (Float32, Float64, Complex64, Complex128, BigFloat, Int) end end -# Issue 10742 +# Issue 10742 and similar @test istril(UpperTriangular(diagm([1,2,3,4]))) @test istriu(LowerTriangular(diagm([1,2,3,4]))) +@test isdiag(UpperTriangular(diagm([1,2,3,4]))) +@test isdiag(LowerTriangular(diagm([1,2,3,4]))) +@test !isdiag(UpperTriangular(rand(4, 4))) +@test !isdiag(LowerTriangular(rand(4, 4)))