diff --git a/src/eigenSelfAdjoint.jl b/src/eigenSelfAdjoint.jl index 60627d7..961660e 100644 --- a/src/eigenSelfAdjoint.jl +++ b/src/eigenSelfAdjoint.jl @@ -654,7 +654,6 @@ LinearAlgebra.eigen!(A::SymTridiagonal; tol = eps(real(eltype(A))), debug = fals LinearAlgebra.eigen!(A::Hermitian; tol = eps(real(eltype(A))), debug = false) = _eigen!(A, tol = tol, debug = debug) - function eigen2!( A::SymmetricTridiagonalFactorization; tol = eps(real(float(one(eltype(A))))), @@ -709,6 +708,12 @@ function LinearAlgebra.eigen(A::Hermitian) T = typeof(sqrt(zero(eltype(A)))) return eigen!(LinearAlgebra.copy_oftype(A, T)) end +function LinearAlgebra.eigen(A::Matrix) + if !ishermitian(A) + throw(ArgumentError("eigen not implement for non-Hermitian matrices of generic type (e.g. Matrix{BigFloat})")) + end + return eigen(Hermitian(A)) +end # Aux (should go somewhere else at some point) function LinearAlgebra.givensAlgorithm(f::Real, g::Real) diff --git a/test/eigengeneral.jl b/test/eigengeneral.jl index c32f99c..bb79db0 100644 --- a/test/eigengeneral.jl +++ b/test/eigengeneral.jl @@ -238,3 +238,13 @@ using Test, GenericLinearAlgebra, LinearAlgebra end end + +@testset "Wrapper function for eigen(Matrix A) where A is hermitian by value but not by type" begin + # just need to verify that the wrapper function correctly calls eigen(Hermitian(A)) + # so no need for multiple numeric tests + a = big(2.0); + A = [1 a; a 0] # A == A^*, but type is Matrix{BigFloat}, not Hermitian{BigFloat, Matrix{BigFloat}} + λs = [(1 - √(1+4a^2))/2 ; (1 + √(1+4a^2))/2] + vals = eigvals(A) + @test sort(vals) ≈ sort(λs) atol=1e-25 +end