Skip to content

Commit d79b744

Browse files
committed
Improve efficiency of minimum/maximum(::Diagonal)
I added a method specialized for Diagonal for each of minimum and maximum. julia> DM = Diagonal(rand(100)); julia> @Btime minimum($DM); # before 27.987 μs (0 allocations: 0 bytes) julia> @Btime minimum($DM); # after 246.091 ns (0 allocations: 0 bytes)
1 parent 413fc47 commit d79b744

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

stdlib/LinearAlgebra/src/diagonal.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,18 @@ function size(D::Diagonal,d::Integer)
8181
return d<=2 ? length(D.diag) : 1
8282
end
8383

84+
function Base.minimum(D::Diagonal{T}) where T <: Number
85+
mindiag = minimum(D.diag)
86+
size(D, 1) > 1 && return (min(zero(T), mindiag))
87+
return mindiag
88+
end
89+
90+
function Base.maximum(D::Diagonal{T}) where T <: Number
91+
maxdiag = Base.maximum(D.diag)
92+
size(D, 1) > 1 && return (max(zero(T), maxdiag))
93+
return maxdiag
94+
end
95+
8496
@inline function getindex(D::Diagonal, i::Int, j::Int)
8597
@boundscheck checkbounds(D, i, j)
8698
if i == j

stdlib/LinearAlgebra/test/diagonal.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ Random.seed!(1)
8080
for func in (det, tr)
8181
@test func(D) func(DM) atol=n^2*eps(relty)*(1+(elty<:Complex))
8282
end
83+
84+
if eltype(D) <: Real
85+
@test minimum(D) minimum(DM)
86+
@test maximum(D) maximum(DM)
87+
end
88+
8389
if relty <: BlasFloat
8490
for func in (exp, sinh, cosh, tanh, sech, csch, coth)
8591
@test func(D) func(DM) atol=n^3*eps(relty)

0 commit comments

Comments
 (0)