Skip to content

Commit bdc9468

Browse files
authored
add methods for symmetric real eigen (#145)
* add methods for symmetric real eigen * remove superfluous real (and type parametrization)
1 parent d76e918 commit bdc9468

File tree

2 files changed

+12
-3
lines changed

2 files changed

+12
-3
lines changed

src/eigenSelfAdjoint.jl

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -448,8 +448,7 @@ function singleShiftQR!(
448448
end
449449

450450
symtri!(A::Hermitian) = A.uplo == 'L' ? symtriLower!(A.data) : symtriUpper!(A.data)
451-
symtri!(A::Symmetric{T}) where {T<:Real} =
452-
A.uplo == 'L' ? symtriLower!(A.data) : symtriUpper!(A.data)
451+
symtri!(A::Symmetric{<:Real}) = A.uplo == 'L' ? symtriLower!(A.data) : symtriUpper!(A.data)
453452

454453
# Assume that lower triangle stores the relevant part
455454
function symtriLower!(
@@ -580,6 +579,7 @@ _eigvals!(A::SymTridiagonal; tol = eps(real(eltype(A))), sortby::Union{Function,
580579

581580
_eigvals!(A::Hermitian; tol = eps(real(eltype(A))), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) = eigvals!(symtri!(A); tol, sortby)
582581

582+
_eigvals!(A::Symmetric{<:Real}; tol = eps(eltype(A)), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) = eigvals!(symtri!(A); tol, sortby)
583583

584584
LinearAlgebra.eigvals!(A::SymmetricTridiagonalFactorization; tol = eps(real(eltype(A))), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) =
585585
_eigvals!(A; tol, sortby)
@@ -589,6 +589,7 @@ LinearAlgebra.eigvals!(A::SymTridiagonal; tol = eps(real(eltype(A))), sortby::Un
589589

590590
LinearAlgebra.eigvals!(A::Hermitian; tol = eps(real(eltype(A))), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) = _eigvals!(A; tol, sortby)
591591

592+
LinearAlgebra.eigvals!(A::Symmetric{<:Real}; tol = eps(eltype(A)), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) = _eigvals!(A; tol, sortby)
592593

593594
_eigen!(A::SymmetricTridiagonalFactorization; tol = eps(real(eltype(A))), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) =
594595
LinearAlgebra.Eigen(LinearAlgebra.sorteig!(eigQL!(A.diagonals, vectors = Array(A.Q), tol = tol)..., sortby)...)
@@ -599,6 +600,7 @@ _eigen!(A::SymTridiagonal; tol = eps(real(eltype(A))), sortby::Union{Function,No
599600

600601
_eigen!(A::Hermitian; tol = eps(real(eltype(A))), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) = _eigen!(symtri!(A), tol = tol)
601602

603+
_eigen!(A::Symmetric{<:Real}; tol = eps(eltype(A)), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) = _eigen!(symtri!(A), tol = tol)
602604

603605
LinearAlgebra.eigen!(A::SymmetricTridiagonalFactorization; tol = eps(real(eltype(A))), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) =
604606
_eigen!(A; tol, sortby)
@@ -607,6 +609,8 @@ LinearAlgebra.eigen!(A::SymTridiagonal; tol = eps(real(eltype(A))), sortby::Unio
607609

608610
LinearAlgebra.eigen!(A::Hermitian; tol = eps(real(eltype(A))), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) = _eigen!(A; tol, sortby)
609611

612+
LinearAlgebra.eigen!(A::Symmetric{<:Real}; tol = eps(eltype(A)), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) = _eigen!(A; tol, sortby)
613+
610614

611615
function eigen2!(
612616
A::SymmetricTridiagonalFactorization;
@@ -628,12 +632,17 @@ end
628632
eigen2!(A::Hermitian; tol = eps(float(real(one(eltype(A)))))) =
629633
eigen2!(symtri!(A), tol = tol)
630634

635+
eigen2!(A::Symmetric{<:Real}; tol = eps(float(one(eltype(A))))) =
636+
eigen2!(symtri!(A), tol = tol)
637+
631638

632639
eigen2(A::SymTridiagonal; tol = eps(float(real(one(eltype(A)))))) =
633640
eigen2!(copy(A), tol = tol)
634641

635642
eigen2(A::Hermitian, tol = eps(float(real(one(eltype(A)))))) = eigen2!(copy(A), tol = tol)
636643

644+
eigen2(A::Symmetric{<:Real}, tol = eps(float(one(eltype(A))))) = eigen2!(copy(A), tol = tol)
645+
637646
# First method of each type here is identical to the method defined in
638647
# LinearAlgebra but is needed for disambiguation
639648
const _eigencopy_oftype = if VERSION >= v"1.9"

test/eigenselfadjoint.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ using Test, GenericLinearAlgebra, LinearAlgebra, Quaternions
3434
end
3535

3636
@testset "(full) Symmetric" for uplo in (:L, :U)
37-
A = Hermitian(big.(randn(n, n)), uplo)
37+
A = Symmetric(big.(randn(n, n)), uplo)
3838
vals, vecs = eigen(A)
3939
@testset "default" begin
4040
@test vecs' * A * vecs diagm(0 => vals)

0 commit comments

Comments
 (0)