Skip to content

Commit 8a7776c

Browse files
authored
Merge pull request #180 from kshyatt/ksh/eigenagain
Let eigen work for "big" Herm/symm matrices
2 parents d238947 + c55ec23 commit 8a7776c

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

src/eigen.jl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ end
1212
end
1313

1414
@inline _eigvals(::Size{(1,1)}, a, permute, scale) = @inbounds return SVector(real(a.data[1]))
15+
@inline _eigvals(::Size{(1, 1)}, a::Base.LinAlg.RealHermSymComplexHerm{T}, permute, scale) where {T <: Real} = @inbounds return SVector(real(parent(a).data[1]))
1516

1617
@inline function _eigvals(::Size{(2,2)}, A::Base.LinAlg.RealHermSymComplexHerm{T}, permute, scale) where {T <: Real}
1718
a = A.data
@@ -102,6 +103,10 @@ end
102103
return SVector(eig1, eig2, eig3)
103104
end
104105

106+
@inline function _eigvals(s::Size, A::Base.LinAlg.RealHermSymComplexHerm{T}, permute, scale) where {T <: Real}
107+
vals = eigvals(Hermitian(Array(parent(A))))
108+
return SVector{s[1], T}(vals)
109+
end
105110

106111

107112

@@ -124,8 +129,8 @@ end
124129
end
125130

126131
@inline function _eig(s::Size, A::Base.LinAlg.RealHermSymComplexHerm{T}, permute, scale) where {T <: Real}
127-
eigen = eigfact(Hermitian(Array(parent(A))); permute=permute, scale=scale)
128-
return (s(eigen.values), s(eigen.vectors)) # Return a SizedArray
132+
eigen = eigfact(Hermitian(Array(parent(A))))
133+
return (SVector{s[1], T}(eigen.values), SMatrix{s[1], s[2], T}(eigen.vectors)) # Return a SizedArray
129134
end
130135

131136

test/eigen.jl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,4 +141,33 @@
141141
@test vecs*diagm(vals)*vecs' m
142142
@test eigvals(m) vals
143143
end
144+
145+
@testset "4×4" for i = 1:100
146+
m_a = randn(4,4)
147+
m_a = m_a*m_a'
148+
m = SMatrix{4,4}(m_a)
149+
150+
(vals_a, vecs_a) = eig(m_a)
151+
(vals, vecs) = eig(m)
152+
@test vals::SVector vals_a
153+
@test eigvals(m) vals
154+
@test (vecs*diagm(vals)*vecs')::SMatrix m
155+
156+
(vals, vecs) = eig(Symmetric(m))
157+
@test vals::SVector vals_a
158+
@test eigvals(m) vals
159+
@test eigvals(Hermitian(m)) vals
160+
@test eigvals(Hermitian(m, :L)) vals
161+
@test (vecs*diagm(vals)*vecs')::SMatrix m
162+
163+
(vals, vecs) = eig(Symmetric(m, :L))
164+
@test vals::SVector vals_a
165+
m_d = randn(SVector{4}); m = diagm(m_d)
166+
(vals, vecs) = eig(Hermitian(m))
167+
@test vals::SVector sort(m_d)
168+
(vals, vecs) = eig(Hermitian(m, :L))
169+
@test vals::SVector sort(m_d)
170+
@test eigvals(m) sort(m_d)
171+
@test eigvals(Hermitian(m)) sort(m_d)
172+
end
144173
end

0 commit comments

Comments
 (0)