Skip to content

Commit 81eee0d

Browse files
authored
Fix #133 (Support sortby) (#134)
1 parent 375e53c commit 81eee0d

File tree

4 files changed

+30
-22
lines changed

4 files changed

+30
-22
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
Manifest.toml
22
docs/build/
3-
.github/.DS_Store
3+
.DS_Store

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "GenericLinearAlgebra"
22
uuid = "14197337-ba66-59df-a3e3-ca00e7dcff7a"
3-
version = "0.3.11"
3+
version = "0.3.12"
44

55
[deps]
66
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"

src/eigenSelfAdjoint.jl

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ function eig2x2!(d::StridedVector, e::StridedVector, j::Integer, vectors::Matrix
162162
return c, s
163163
end
164164

165-
function eigvalsPWK!(S::SymTridiagonal{T}; tol = eps(T)) where {T<:Real}
165+
function eigvalsPWK!(S::SymTridiagonal{T}; tol = eps(T), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) where {T<:Real}
166166
d = S.dv
167167
e = S.ev
168168
n = length(d)
@@ -216,7 +216,7 @@ function eigvalsPWK!(S::SymTridiagonal{T}; tol = eps(T)) where {T<:Real}
216216
end
217217
end
218218
end
219-
sort!(d)
219+
LinearAlgebra.sorteig!(d, sortby)
220220
end
221221

222222
function eigQL!(
@@ -570,39 +570,39 @@ function symtriUpper!(
570570
end
571571

572572

573-
_eigvals!(A::SymmetricTridiagonalFactorization; tol = eps(real(eltype(A)))) =
574-
eigvalsPWK!(A.diagonals, tol = tol)
573+
_eigvals!(A::SymmetricTridiagonalFactorization; tol = eps(real(eltype(A))), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) =
574+
eigvalsPWK!(A.diagonals; tol, sortby)
575575

576-
_eigvals!(A::SymTridiagonal; tol = eps(real(eltype(A)))) = eigvalsPWK!(A, tol = tol)
576+
_eigvals!(A::SymTridiagonal; tol = eps(real(eltype(A))), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) = eigvalsPWK!(A; tol, sortby)
577577

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

580580

581-
LinearAlgebra.eigvals!(A::SymmetricTridiagonalFactorization; tol = eps(real(eltype(A)))) =
582-
_eigvals!(A, tol = tol)
581+
LinearAlgebra.eigvals!(A::SymmetricTridiagonalFactorization; tol = eps(real(eltype(A))), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) =
582+
_eigvals!(A; tol, sortby)
583583

584-
LinearAlgebra.eigvals!(A::SymTridiagonal; tol = eps(real(eltype(A)))) =
585-
_eigvals!(A, tol = tol)
584+
LinearAlgebra.eigvals!(A::SymTridiagonal; tol = eps(real(eltype(A))), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) =
585+
_eigvals!(A; tol, sortby)
586586

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

589589

590-
_eigen!(A::SymmetricTridiagonalFactorization; tol = eps(real(eltype(A)))) =
591-
LinearAlgebra.Eigen(eigQL!(A.diagonals, vectors = Array(A.Q), tol = tol)...)
590+
_eigen!(A::SymmetricTridiagonalFactorization; tol = eps(real(eltype(A))), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) =
591+
LinearAlgebra.Eigen(LinearAlgebra.sorteig!(eigQL!(A.diagonals, vectors = Array(A.Q), tol = tol)..., sortby)...)
592592

593-
_eigen!(A::SymTridiagonal; tol = eps(real(eltype(A)))) = LinearAlgebra.Eigen(
593+
_eigen!(A::SymTridiagonal; tol = eps(real(eltype(A))), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) = LinearAlgebra.Eigen(
594594
eigQL!(A, vectors = Matrix{eltype(A)}(I, size(A, 1), size(A, 1)), tol = tol)...,
595595
)
596596

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

599599

600-
LinearAlgebra.eigen!(A::SymmetricTridiagonalFactorization; tol = eps(real(eltype(A)))) =
601-
_eigen!(A, tol = tol)
600+
LinearAlgebra.eigen!(A::SymmetricTridiagonalFactorization; tol = eps(real(eltype(A))), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) =
601+
_eigen!(A; tol, sortby)
602602

603-
LinearAlgebra.eigen!(A::SymTridiagonal; tol = eps(real(eltype(A)))) = _eigen!(A, tol = tol)
603+
LinearAlgebra.eigen!(A::SymTridiagonal; tol = eps(real(eltype(A))), sortby::Union{Function,Nothing}=LinearAlgebra.eigsortby) = _eigen!(A; tol, sortby)
604604

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

607607

608608
function eigen2!(

test/eigenselfadjoint.jl

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Test, GenericLinearAlgebra, LinearAlgebra, Quaternions
2-
Base.isreal(q::Quaternion) = q.v1 == q.v2 == q.v3 == 0
32

43
@testset "The selfadjoint eigen problem" begin
54
n = 50
@@ -157,4 +156,13 @@ Base.isreal(q::Quaternion) = q.v1 == q.v2 == q.v3 == 0
157156
@test hypot(c, s) 1
158157
end
159158
end
159+
160+
@testset "#133" begin
161+
A = SymTridiagonal{BigFloat}(randn(5), randn(4))
162+
T = Tridiagonal(A)
163+
@test eigvals(A) == eigvals(T) == eigvals(A; sortby=LinearAlgebra.eigsortby) == eigvals(T; sortby=LinearAlgebra.eigsortby) == eigvals!(deepcopy(A); sortby=LinearAlgebra.eigsortby)
164+
@test eigen(A).values == eigen(T).values == eigen(A; sortby=LinearAlgebra.eigsortby).values == eigen(T; sortby=LinearAlgebra.eigsortby).values
165+
# compare abs to avoid sign issues
166+
@test abs.(eigen(A).vectors) == abs.(eigen(T).vectors) == abs.(eigen(A; sortby=LinearAlgebra.eigsortby).vectors) == abs.(eigen(T; sortby=LinearAlgebra.eigsortby).vectors)
167+
end
160168
end

0 commit comments

Comments
 (0)