From 6f8f6e8d0737d5e84053ffa8a5eecd926ef1b6c2 Mon Sep 17 00:00:00 2001 From: Jishnu Bhattacharya Date: Mon, 12 May 2025 16:44:56 +0530 Subject: [PATCH 1/3] log for dense diagonal matrix with negative elements --- src/dense.jl | 8 ++++++-- test/dense.jl | 9 +++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/dense.jl b/src/dense.jl index 9e7eff4f..1b1df860 100644 --- a/src/dense.jl +++ b/src/dense.jl @@ -914,8 +914,12 @@ julia> log(A) """ function log(A::AbstractMatrix) # If possible, use diagonalization - if isdiag(A) - return applydiagonal(log, A) + if isdiag(A) && eltype(A) <: Union{Real,Complex} + if eltype(A) <: Real && all(>(0), diagview(A)) + return applydiagonal(log, A) + else + return applydiagonal(log∘complex, A) + end elseif ishermitian(A) logHermA = log(Hermitian(A)) PH = parent(logHermA) diff --git a/test/dense.jl b/test/dense.jl index 99e0b429..9f5acdf0 100644 --- a/test/dense.jl +++ b/test/dense.jl @@ -1418,4 +1418,13 @@ end @test tril(GenericArray(M),-1) == res' end +@testset "log for diagonal" begin + D = diagm([-2.0, 2.0]) + @test log(D) ≈ log(UpperTriangular(D)) + D = diagm([2.0, 2.0]) + @test log(D) ≈ log(UpperTriangular(D)) + D = diagm([2.0, 2.0*im]) + @test log(D) ≈ log(UpperTriangular(D)) +end + end # module TestDense From 6852f3f1c5dfe93399cafcbc8d534a6dc9d14c1c Mon Sep 17 00:00:00 2001 From: Jishnu Bhattacharya Date: Mon, 12 May 2025 16:46:02 +0530 Subject: [PATCH 2/3] Check equality with zero --- src/dense.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dense.jl b/src/dense.jl index 1b1df860..6cbd851f 100644 --- a/src/dense.jl +++ b/src/dense.jl @@ -915,7 +915,7 @@ julia> log(A) function log(A::AbstractMatrix) # If possible, use diagonalization if isdiag(A) && eltype(A) <: Union{Real,Complex} - if eltype(A) <: Real && all(>(0), diagview(A)) + if eltype(A) <: Real && all(>=(0), diagview(A)) return applydiagonal(log, A) else return applydiagonal(log∘complex, A) From a9ac43f4eb5506542c26fa2fe3dbf39e2486fa4d Mon Sep 17 00:00:00 2001 From: Jishnu Bhattacharya Date: Mon, 12 May 2025 16:47:48 +0530 Subject: [PATCH 3/3] Test for zero element --- test/dense.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/dense.jl b/test/dense.jl index 9f5acdf0..89bf340b 100644 --- a/test/dense.jl +++ b/test/dense.jl @@ -1421,6 +1421,8 @@ end @testset "log for diagonal" begin D = diagm([-2.0, 2.0]) @test log(D) ≈ log(UpperTriangular(D)) + D = diagm([-2.0, 0.0]) + @test log(D) ≈ log(UpperTriangular(D)) D = diagm([2.0, 2.0]) @test log(D) ≈ log(UpperTriangular(D)) D = diagm([2.0, 2.0*im])