Skip to content

Commit 6c087f7

Browse files
authored
Even more eigfact fun (#294)
* Even more eigfact fun
1 parent 3e9b6eb commit 6c087f7

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

src/eigen.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ end
66
@inline function eigvals(a::StaticArray; permute::Bool=true, scale::Bool=true)
77
if ishermitian(a)
88
_eigvals(Size(a), Hermitian(a), permute, scale)
9+
elseif Size(a) == Size{(1,1)}()
10+
_eigvals(Size(a), a, permute, scale)
911
else
1012
error("Only hermitian matrices are diagonalizable by *StaticArrays*. Non-Hermitian matrices should be converted to `Array` first.")
1113
end
1214
end
1315

14-
@inline _eigvals(::Size{(1,1)}, a, permute, scale) = @inbounds return SVector(real(a.data[1]))
16+
@inline _eigvals(::Size{(1,1)}, a, permute, scale) = @inbounds return SVector(Tuple(a))
1517
@inline _eigvals(::Size{(1, 1)}, a::Base.LinAlg.RealHermSymComplexHerm{T}, permute, scale) where {T <: Real} = @inbounds return SVector(real(parent(a).data[1]))
1618

1719
@inline function _eigvals(::Size{(2,2)}, A::Base.LinAlg.RealHermSymComplexHerm{T}, permute, scale) where {T <: Real}

test/eigen.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
ef = eigfact(Symmetric(m))
1616
@test ef[:values] === SVector(2.0)
1717
@test ef[:vectors] === SMatrix{1,1}(1.0)
18+
# handle non-Hermitian case
19+
m = @SMatrix [2.0+im]
20+
@test eigvals(m) === SVector(2.0+im)
1821
end
1922

2023
@testset "2×2" for i = 1:100
@@ -39,6 +42,9 @@
3942
ef = eigfact(Symmetric(m))
4043
@test ef[:values]::SVector vals_a
4144
@test (ef[:vectors]*diagm(vals)*ef[:vectors]')::SMatrix m
45+
ef = eigfact(Symmetric(m, :L))
46+
@test ef[:values]::SVector vals_a
47+
@test (ef[:vectors]*diagm(vals)*ef[:vectors]')::SMatrix m
4248

4349
(vals, vecs) = eig(Hermitian(m))
4450
@test vals::SVector vals_a
@@ -48,6 +54,9 @@
4854
ef = eigfact(Hermitian(m))
4955
@test ef[:values]::SVector vals_a
5056
@test (ef[:vectors]*diagm(vals)*ef[:vectors]')::SMatrix m
57+
ef = eigfact(Hermitian(m, :L))
58+
@test ef[:values]::SVector vals_a
59+
@test (ef[:vectors]*diagm(vals)*ef[:vectors]')::SMatrix m
5160

5261
m_d = randn(SVector{2}); m = diagm(m_d)
5362
(vals, vecs) = eig(Hermitian(m))

0 commit comments

Comments
 (0)