Skip to content

Commit 80db579

Browse files
tpappandreasnoack
authored andcommitted
Add eigmin(::Diagonal). (#27863)
Fixes #27847 by extenting `eigmin` to `AbstractMatrix`. This requires that `eigvals` accepts `permute` and `scale`, which are then ignored.
1 parent 17d3918 commit 80db579

File tree

3 files changed

+15
-3
lines changed

3 files changed

+15
-3
lines changed

stdlib/LinearAlgebra/src/diagonal.jl

+3-2
Original file line numberDiff line numberDiff line change
@@ -455,8 +455,9 @@ function pinv(D::Diagonal{T}, tol::Real) where T
455455
end
456456

457457
#Eigensystem
458-
eigvals(D::Diagonal{<:Number}) = D.diag
459-
eigvals(D::Diagonal) = [eigvals(x) for x in D.diag] #For block matrices, etc.
458+
eigvals(D::Diagonal{<:Number}; permute::Bool=true, scale::Bool=true) = D.diag
459+
eigvals(D::Diagonal; permute::Bool=true, scale::Bool=true) =
460+
[eigvals(x) for x in D.diag] #For block matrices, etc.
460461
eigvecs(D::Diagonal) = Matrix{eltype(D)}(I, size(D))
461462
function eigen(D::Diagonal; permute::Bool=true, scale::Bool=true)
462463
if any(!isfinite, D.diag)

stdlib/LinearAlgebra/src/eigen.jl

+2-1
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,8 @@ Stacktrace:
296296
[...]
297297
```
298298
"""
299-
function eigmin(A::Union{Number, StridedMatrix}; permute::Bool=true, scale::Bool=true)
299+
function eigmin(A::Union{Number, AbstractMatrix};
300+
permute::Bool=true, scale::Bool=true)
300301
v = eigvals(A, permute = permute, scale = scale)
301302
if eltype(v)<:Complex
302303
throw(DomainError(A, "`A` cannot have complex eigenvalues."))

stdlib/LinearAlgebra/test/diagonal.jl

+10
Original file line numberDiff line numberDiff line change
@@ -272,12 +272,22 @@ srand(1)
272272
@test svdvals(D) == s
273273
@test svd(D).V == V
274274
end
275+
275276
end
276277

277278
@testset "svdvals and eigvals (#11120/#11247)" begin
278279
D = Diagonal(Matrix{Float64}[randn(3,3), randn(2,2)])
279280
@test sort([svdvals(D)...;], rev = true) svdvals([D.diag[1] zeros(3,2); zeros(2,3) D.diag[2]])
280281
@test [eigvals(D)...;] eigvals([D.diag[1] zeros(3,2); zeros(2,3) D.diag[2]])
282+
283+
end
284+
285+
@testset "eigmin (#27847)" begin
286+
for _ in 1:100
287+
d = randn(rand(1:10))
288+
D = Diagonal(d)
289+
@test eigmin(D) == minimum(d)
290+
end
281291
end
282292

283293
@testset "isposdef" begin

0 commit comments

Comments
 (0)