Skip to content

Commit ca2a03b

Browse files
authored
Use <= when testing for deflation for avoid issue with zeros in (#53)
diagonal. Fixes #52
1 parent 31d2d80 commit ca2a03b

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

src/eigenSelfAdjoint.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ function eigvalsPWK!(S::SymTridiagonal{T}; tol = eps(T), debug::Bool=false) wher
174174
while true
175175
# Check for zero off diagonal elements
176176
for be in blockstart + 1:n
177-
if abs(e[be - 1]) < tol*sqrt(abs(d[be - 1]))*sqrt(abs(d[be]))
177+
if abs(e[be - 1]) <= tol*sqrt(abs(d[be - 1]))*sqrt(abs(d[be]))
178178
blockend = be - 1
179179
break
180180
end
@@ -231,7 +231,7 @@ function eigQL!(S::SymTridiagonal{T};
231231
while true
232232
# Check for zero off diagonal elements
233233
for be = blockstart+1:n
234-
if abs(e[be-1]) < tol*sqrt(abs(d[be-1]))*sqrt(abs(d[be]))
234+
if abs(e[be-1]) <= tol*sqrt(abs(d[be-1]))*sqrt(abs(d[be]))
235235
blockend = be - 1
236236
break
237237
end

test/eigenselfadjoint.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,16 @@ Base.isreal(q::Quaternion) = q.v1 == q.v2 == q.v3 == 0
9090
@test GenericLinearAlgebra._eigen!(SymTridiagonal([1.0], Float64[])).values == [1.0]
9191
@test GenericLinearAlgebra._eigen!(SymTridiagonal([1.0], Float64[])).vectors == fill(1.0, 1, 1)
9292
end
93+
94+
# Issue #52
95+
@testset "convergence criterion when diagonal has zeros" begin
96+
M1 = Hermitian(zeros(3, 3))
97+
M1[1,1] = 0.01
98+
M2 = Hermitian(zeros(3, 3))
99+
M2[3, 3] = 0.01
100+
@test eigvals(M1) == GenericLinearAlgebra._eigvals!(copy(M1))
101+
@test eigvals(M2) == GenericLinearAlgebra._eigvals!(copy(M2))
102+
@test eigen(M1).values == GenericLinearAlgebra._eigen!(copy(M1)).values
103+
@test eigen(M2).values == GenericLinearAlgebra._eigen!(copy(M2)).values
104+
end
93105
end

0 commit comments

Comments
 (0)