Skip to content

Commit

Permalink
Widen eltype in complex hermitian tridiagonal eigen (#52802)
Browse files Browse the repository at this point in the history
Close #52801 by widening the `eltype` appropriately.
  • Loading branch information
jishnub committed Jan 9, 2024
1 parent bd3eab6 commit 17280b2
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 5 deletions.
10 changes: 5 additions & 5 deletions stdlib/LinearAlgebra/src/symmetriceigen.jl
Original file line number Diff line number Diff line change
Expand Up @@ -309,19 +309,19 @@ function eigen(A::Hermitian{Complex{T}, <:Tridiagonal}; kwargs...) where {T}
E = dl
Er = abs.(E)
end
S = Vector{Complex{T}}(undef, N)
S = Vector{eigtype(eltype(A))}(undef, N)
S[1] = 1
for i 1:N-1
S[i+1] = iszero(Er[i]) ? one(Complex{T}) : S[i] * sign(E[i])
S[i+1] = iszero(Er[i]) ? oneunit(eltype(S)) : S[i] * sign(E[i])
end
B = SymTridiagonal(real(d), Er)
B = SymTridiagonal(float.(real.(d)), Er)
Λ, Φ = eigen(B; kwargs...)
return Eigen(Λ, Diagonal(S) * Φ)
end
end

function eigvals(A::Hermitian{Complex{T}, <:Tridiagonal}; kwargs...) where {T}
(; dl, d, du) = parent(A)
E = A.uplo == 'U' ? abs.(du) : abs.(dl)
eigvals(SymTridiagonal(real.(d), E); kwargs...)
Er = A.uplo == 'U' ? abs.(du) : abs.(dl)
eigvals(SymTridiagonal(float.(real.(d)), Er); kwargs...)
end
7 changes: 7 additions & 0 deletions stdlib/LinearAlgebra/test/symmetriceigen.jl
Original file line number Diff line number Diff line change
Expand Up @@ -144,4 +144,11 @@ end
@test e0 eu
end

@testset "Hermitian tridiagonal eigen with Complex{Int} elements (#52801)" begin
dv, ev = fill(complex(2), 4), fill(3-4im, 3)
HT = Hermitian(Tridiagonal(ev, dv, ev))
λ, V = eigen(HT)
@test HT * V V * Diagonal(λ)
end

end # module TestSymmetricEigen

0 comments on commit 17280b2

Please sign in to comment.