diff --git a/src/dense.jl b/src/dense.jl index 9e7eff4f..6cbd851f 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..89bf340b 100644 --- a/test/dense.jl +++ b/test/dense.jl @@ -1418,4 +1418,15 @@ 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, 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]) + @test log(D) ≈ log(UpperTriangular(D)) +end + end # module TestDense