From ff77b71a9395fdede48489ca5be975b89ac272ce Mon Sep 17 00:00:00 2001 From: Luis-Varona Date: Thu, 9 Oct 2025 01:03:27 -0300 Subject: [PATCH 1/2] Add 'eigmin'/'eigmax' methods for 'Eigen' We add the methods 'eigmin' and 'eigmax' on the type 'F::Union{Eigen, GeneralizedEigen}' similarly to how 'eigvals' is defined on 'F'. Note that the corresponding unit tests in 'test/eigen.jl' that call 'eigvals' on such a struct are updated to include 'eigmin' and 'eigmax' calls as well; if all eigenvalues are real, the actual functionality of the methods is tested, and if any happen to be complex, then we test that they throw 'MethodError's. (Resolves #1464 by @longemen3000.) --- src/eigen.jl | 2 ++ test/eigen.jl | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/eigen.jl b/src/eigen.jl index 0837491a..95bab86a 100644 --- a/src/eigen.jl +++ b/src/eigen.jl @@ -276,6 +276,8 @@ eigvecs(A::Union{Number, AbstractMatrix}; kws...) = eigvecs(F::Union{Eigen, GeneralizedEigen}) = F.vectors eigvals(F::Union{Eigen, GeneralizedEigen}) = F.values +eigmin(F::Union{Eigen, GeneralizedEigen}) = minimum(F.values) +eigmax(F::Union{Eigen, GeneralizedEigen}) = maximum(F.values) """ eigvals!(A; permute::Bool=true, scale::Bool=true, sortby) -> values diff --git a/test/eigen.jl b/test/eigen.jl index 67e58d34..b7a8f955 100644 --- a/test/eigen.jl +++ b/test/eigen.jl @@ -44,6 +44,15 @@ aimg = randn(n,n)/2 @test inv(a) ≈ inv(f) @test isposdef(a) == isposdef(f) @test eigvals(f) === f.values + + if all(isreal, f.values) + @test eigmin(f) == minimum(f.values) + @test eigmax(f) == maximum(f.values) + else + @test_throws MethodError eigmin(f) + @test_throws MethodError eigmax(f) + end + @test eigvecs(f) === f.vectors @test Array(f) ≈ a @@ -81,6 +90,15 @@ aimg = randn(n,n)/2 @test prod(f.values) ≈ prod(eigvals(asym_sg/(ASG2))) atol=200ε @test eigvecs(asym_sg, ASG2) == f.vectors @test eigvals(f) === f.values + + if all(isreal, f.values) + @test eigmin(f) == minimum(f.values) + @test eigmax(f) == maximum(f.values) + else + @test_throws MethodError eigmin(f) + @test_throws MethodError eigmax(f) + end + @test eigvecs(f) === f.vectors @test_throws FieldError f.Z From fe5a63b7ebb680ad906b46f66335b05dcdf65da9 Mon Sep 17 00:00:00 2001 From: "Luis M. B. Varona" Date: Thu, 9 Oct 2025 10:09:18 -0300 Subject: [PATCH 2/2] Change 'F.values' calls to 'eigvals(F)' This commit incorporates changes suggested by @jishnub to edit all associated 'F.values'/'f.values' calls in the diff to 'eigvals(F)'/'eigvals(f)' instead. Co-authored-by: Jishnu Bhattacharya --- src/eigen.jl | 4 ++-- test/eigen.jl | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/eigen.jl b/src/eigen.jl index 95bab86a..f565a547 100644 --- a/src/eigen.jl +++ b/src/eigen.jl @@ -276,8 +276,8 @@ eigvecs(A::Union{Number, AbstractMatrix}; kws...) = eigvecs(F::Union{Eigen, GeneralizedEigen}) = F.vectors eigvals(F::Union{Eigen, GeneralizedEigen}) = F.values -eigmin(F::Union{Eigen, GeneralizedEigen}) = minimum(F.values) -eigmax(F::Union{Eigen, GeneralizedEigen}) = maximum(F.values) +eigmin(F::Union{Eigen, GeneralizedEigen}) = minimum(eigvals(F)) +eigmax(F::Union{Eigen, GeneralizedEigen}) = maximum(eigvals(F)) """ eigvals!(A; permute::Bool=true, scale::Bool=true, sortby) -> values diff --git a/test/eigen.jl b/test/eigen.jl index b7a8f955..974b657c 100644 --- a/test/eigen.jl +++ b/test/eigen.jl @@ -45,9 +45,9 @@ aimg = randn(n,n)/2 @test isposdef(a) == isposdef(f) @test eigvals(f) === f.values - if all(isreal, f.values) - @test eigmin(f) == minimum(f.values) - @test eigmax(f) == maximum(f.values) + if all(isreal, eigvals(f)) + @test eigmin(f) == minimum(eigvals(f)) + @test eigmax(f) == maximum(eigvals(f)) else @test_throws MethodError eigmin(f) @test_throws MethodError eigmax(f) @@ -91,9 +91,9 @@ aimg = randn(n,n)/2 @test eigvecs(asym_sg, ASG2) == f.vectors @test eigvals(f) === f.values - if all(isreal, f.values) - @test eigmin(f) == minimum(f.values) - @test eigmax(f) == maximum(f.values) + if all(isreal, eigvals(f)) + @test eigmin(f) == minimum(eigvals(f)) + @test eigmax(f) == maximum(eigvals(f)) else @test_throws MethodError eigmin(f) @test_throws MethodError eigmax(f)