Skip to content

Commit 1895942

Browse files
committed
Eigvecs for specific eigvals for Symmetric/Hermitian
1 parent 3f46f5f commit 1895942

File tree

3 files changed

+27
-2
lines changed

3 files changed

+27
-2
lines changed

src/symmetriceigen.jl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,12 @@ function eigvals!(A::Hermitian{T,S}, B::Hermitian{T,S}; sortby::Union{Function,N
331331
end
332332
eigvecs(A::HermOrSym) = eigvecs(eigen(A))
333333

334+
function eigvecs(A::RealHermSymComplexHerm, eigvals::AbstractVector{<:Real})
335+
F = hessenberg(A) # transform to SymTridiagonal form
336+
X = eigvecs(F.H, eigvals)
337+
return F.Q * X # transform eigvecs of F.H back to eigvecs of A
338+
end
339+
334340
function eigvals(A::AbstractMatrix, C::Cholesky; sortby::Union{Function,Nothing}=nothing)
335341
if ishermitian(A)
336342
eigvals!(eigencopy_oftype(Hermitian(A), eigtype(eltype(A))), C; sortby)

src/tridiag.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ eigmin(A::SymTridiagonal) = eigvals(A, 1:1)[1]
311311

312312
#Compute selected eigenvectors only corresponding to particular eigenvalues
313313
"""
314-
eigvecs(A::SymTridiagonal[, eigvals]) -> Matrix
314+
eigvecs(A::Union{Symmetric, Hermitian, SymTridiagonal}[, eigvals])::Matrix
315315
316316
Return a matrix `M` whose columns are the eigenvectors of `A`. (The `k`th eigenvector can
317317
be obtained from the slice `M[:, k]`.)
@@ -346,7 +346,7 @@ julia> eigvecs(A, [1.])
346346
-0.5547001962252291
347347
```
348348
"""
349-
eigvecs(A::SymTridiagonal{<:BlasFloat,<:StridedVector}, eigvals::Vector{<:Real}) = LAPACK.stein!(A.dv, A.ev, eigvals)
349+
eigvecs(A::SymTridiagonal{<:BlasFloat,<:StridedVector}, eigvals::StridedVector{<:Real}) = LAPACK.stein!(A.dv, A.ev, eigvals)
350350

351351
function svdvals!(A::SymTridiagonal)
352352
vals = eigvals!(A)

test/symmetriceigen.jl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,4 +199,23 @@ end
199199
end
200200
end
201201

202+
@testset "eigvecs for specific eigvals" begin
203+
function testeigvecs(S, vals)
204+
V = eigvecs(S, vals)
205+
@test S * V V * Diagonal(vals)
206+
end
207+
for T in (Symmetric, Hermitian)
208+
S = T(rand(3,3))
209+
vals = eigvals(S)
210+
testeigvecs(S, vals)
211+
testeigvecs(S, vals[1:2])
212+
testeigvecs(S, @view vals[2:2])
213+
end
214+
H = Hermitian(rand(ComplexF64,3,3))
215+
vals = eigvals(H)
216+
testeigvecs(H, vals)
217+
testeigvecs(H, vals[1:2])
218+
testeigvecs(H, @view vals[2:2])
219+
end
220+
202221
end # module TestSymmetricEigen

0 commit comments

Comments
 (0)