Skip to content

Commit 6f73f65

Browse files
Luis-Varonajishnub
andauthored
Add 'eigmin'/'eigmax' methods for 'Eigen' (#1468)
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.) --------- Co-authored-by: Jishnu Bhattacharya <[email protected]>
1 parent 7b21cab commit 6f73f65

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

src/eigen.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,8 @@ eigvecs(A::Union{Number, AbstractMatrix}; kws...) =
276276
eigvecs(F::Union{Eigen, GeneralizedEigen}) = F.vectors
277277

278278
eigvals(F::Union{Eigen, GeneralizedEigen}) = F.values
279+
eigmin(F::Union{Eigen, GeneralizedEigen}) = minimum(eigvals(F))
280+
eigmax(F::Union{Eigen, GeneralizedEigen}) = maximum(eigvals(F))
279281

280282
"""
281283
eigvals!(A; permute::Bool=true, scale::Bool=true, sortby) -> values

test/eigen.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,15 @@ aimg = randn(n,n)/2
4444
@test inv(a) inv(f)
4545
@test isposdef(a) == isposdef(f)
4646
@test eigvals(f) === f.values
47+
48+
if all(isreal, eigvals(f))
49+
@test eigmin(f) == minimum(eigvals(f))
50+
@test eigmax(f) == maximum(eigvals(f))
51+
else
52+
@test_throws MethodError eigmin(f)
53+
@test_throws MethodError eigmax(f)
54+
end
55+
4756
@test eigvecs(f) === f.vectors
4857
@test Array(f) a
4958

@@ -81,6 +90,15 @@ aimg = randn(n,n)/2
8190
@test prod(f.values) prod(eigvals(asym_sg/(ASG2))) atol=200ε
8291
@test eigvecs(asym_sg, ASG2) == f.vectors
8392
@test eigvals(f) === f.values
93+
94+
if all(isreal, eigvals(f))
95+
@test eigmin(f) == minimum(eigvals(f))
96+
@test eigmax(f) == maximum(eigvals(f))
97+
else
98+
@test_throws MethodError eigmin(f)
99+
@test_throws MethodError eigmax(f)
100+
end
101+
84102
@test eigvecs(f) === f.vectors
85103
@test_throws FieldError f.Z
86104

0 commit comments

Comments
 (0)