|
3 | 3 | m = @SMatrix [2.0]
|
4 | 4 | (vals, vecs) = eig(m)
|
5 | 5 | @test vals === SVector(2.0)
|
| 6 | + @test eigvals(m) === vals |
6 | 7 | @test vecs === SMatrix{1,1}(1.0)
|
7 | 8 |
|
8 | 9 | (vals, vecs) = eig(Symmetric(m))
|
|
18 | 19 | (vals_a, vecs_a) = eig(m)
|
19 | 20 | (vals, vecs) = eig(m)
|
20 | 21 | @test vals::SVector ≈ vals_a
|
| 22 | + @test eigvals(m) ≈ vals |
21 | 23 | @test (vecs*diagm(vals)*vecs')::SMatrix ≈ m
|
22 | 24 |
|
23 | 25 | (vals, vecs) = eig(Symmetric(m))
|
24 | 26 | @test vals::SVector ≈ vals_a
|
| 27 | + @test eigvals(m) ≈ vals |
25 | 28 | @test (vecs*diagm(vals)*vecs')::SMatrix ≈ m
|
26 | 29 | end
|
27 | 30 |
|
|
33 | 36 | (vals_a, vecs_a) = eig(m)
|
34 | 37 | (vals, vecs) = eig(m)
|
35 | 38 | @test vals::SVector ≈ vals_a
|
| 39 | + @test eigvals(m) ≈ vals |
36 | 40 | @test (vecs*diagm(vals)*vecs')::SMatrix ≈ m
|
37 | 41 |
|
38 | 42 | (vals, vecs) = eig(Symmetric(m))
|
39 | 43 | @test vals::SVector ≈ vals_a
|
| 44 | + @test eigvals(m) ≈ vals |
40 | 45 | @test (vecs*diagm(vals)*vecs')::SMatrix ≈ m
|
41 | 46 | end
|
42 | 47 |
|
43 | 48 | @testset "3x3 degenerate cases" begin
|
44 | 49 | # Rank 1
|
45 | 50 | v = randn(SVector{3,Float64})
|
46 | 51 | m = v*v'
|
47 |
| - eigvals, eigvecs = eig(m)::Tuple{SVector,SMatrix} |
| 52 | + vals, vecs = eig(m)::Tuple{SVector,SMatrix} |
48 | 53 |
|
49 |
| - @test isapprox(eigvecs'*eigvecs, eye(SMatrix{3,3,Float64}); atol = 1e-4) # This algorithm isn't super accurate |
50 |
| - @test eigvals ≈ SVector(0.0, 0.0, sumabs2(v)) |
| 54 | + @test vecs'*vecs ≈ eye(SMatrix{3,3,Float64}) |
| 55 | + @test vals ≈ SVector(0.0, 0.0, sumabs2(v)) |
| 56 | + @test eigvals(m) ≈ vals |
51 | 57 |
|
52 | 58 | # Rank 2
|
53 | 59 | v2 = randn(SVector{3,Float64})
|
54 | 60 | v2 -= dot(v,v2)*v/sumabs2(v)
|
55 | 61 | m += v2*v2'
|
56 |
| - eigvals, eigvecs = eig(m)::Tuple{SVector,SMatrix} |
| 62 | + vals, vecs = eig(m)::Tuple{SVector,SMatrix} |
57 | 63 |
|
58 |
| - @test isapprox(eigvecs'*eigvecs, eye(SMatrix{3,3,Float64}); atol = 1e-4) |
| 64 | + @test vecs'*vecs ≈ eye(SMatrix{3,3,Float64}) |
59 | 65 | if sumabs2(v) < sumabs2(v2)
|
60 |
| - @test eigvals ≈ SVector(0.0, sumabs2(v), sumabs2(v2)) |
| 66 | + @test vals ≈ SVector(0.0, sumabs2(v), sumabs2(v2)) |
61 | 67 | else
|
62 |
| - @test eigvals ≈ SVector(0.0, sumabs2(v2), sumabs2(v)) |
| 68 | + @test vals ≈ SVector(0.0, sumabs2(v2), sumabs2(v)) |
63 | 69 | end
|
| 70 | + @test eigvals(m) ≈ vals |
64 | 71 |
|
65 | 72 | # Degeneracy (2 large)
|
66 | 73 | m = -99*(v*v')/sumabs2(v) + 100*eye(SMatrix{3,3,Float64})
|
67 |
| - eigvals, eigvecs = eig(m)::Tuple{SVector,SMatrix} |
| 74 | + vals, vecs = eig(m)::Tuple{SVector,SMatrix} |
68 | 75 |
|
69 |
| - @test isapprox(eigvecs'*eigvecs, eye(SMatrix{3,3,Float64}); atol = 1e-4) |
70 |
| - @test eigvals ≈ SVector(1.0, 100.0, 100.0) |
| 76 | + @test vecs'*vecs ≈ eye(SMatrix{3,3,Float64}) |
| 77 | + @test vals ≈ SVector(1.0, 100.0, 100.0) |
| 78 | + @test eigvals(m) ≈ vals |
71 | 79 |
|
72 | 80 | # Degeneracy (2 small)
|
73 | 81 | m = (v*v')/sumabs2(v) + 1e-2*eye(SMatrix{3,3,Float64})
|
74 |
| - eigvals, eigvecs = eig(m)::Tuple{SVector,SMatrix} |
| 82 | + vals, vecs = eig(m)::Tuple{SVector,SMatrix} |
75 | 83 |
|
76 |
| - @test isapprox(eigvecs'*eigvecs, eye(SMatrix{3,3,Float64}); atol = 1e-4) |
77 |
| - @test eigvals ≈ SVector(1e-2, 1e-2, 1.01) |
| 84 | + @test vecs'*vecs ≈ eye(SMatrix{3,3,Float64}) |
| 85 | + @test vals ≈ SVector(1e-2, 1e-2, 1.01) |
| 86 | + @test eigvals(m) ≈ vals |
78 | 87 |
|
79 | 88 | # Block diagonal
|
80 | 89 | m = @SMatrix [1.0 0.0 0.0;
|
81 | 90 | 0.0 1.0 1.0;
|
82 | 91 | 0.0 1.0 1.0]
|
83 |
| - eigvals, eigvecs = eig(m)::Tuple{SVector,SMatrix} |
| 92 | + vals, vecs = eig(m)::Tuple{SVector,SMatrix} |
84 | 93 |
|
85 |
| - @test eigvals ≈ [0.0, 1.0, 2.0] |
86 |
| - @test eigvecs*diagm(eigvals)*eigvecs' ≈ m |
| 94 | + @test vals ≈ [0.0, 1.0, 2.0] |
| 95 | + @test vecs*diagm(vals)*vecs' ≈ m |
| 96 | + @test eigvals(m) ≈ vals |
87 | 97 |
|
88 | 98 | m = @SMatrix [1.0 0.0 1.0;
|
89 | 99 | 0.0 1.0 0.0;
|
90 | 100 | 1.0 0.0 1.0]
|
91 |
| - eigvals, eigvecs = eig(m)::Tuple{SVector,SMatrix} |
| 101 | + vals, vecs = eig(m)::Tuple{SVector,SMatrix} |
92 | 102 |
|
93 |
| - @test eigvals ≈ [0.0, 1.0, 2.0] |
94 |
| - @test eigvecs*diagm(eigvals)*eigvecs' ≈ m |
| 103 | + @test vals ≈ [0.0, 1.0, 2.0] |
| 104 | + @test vecs*diagm(vals)*vecs' ≈ m |
| 105 | + @test eigvals(m) ≈ vals |
95 | 106 |
|
96 | 107 | m = @SMatrix [1.0 1.0 0.0;
|
97 | 108 | 1.0 1.0 0.0;
|
98 | 109 | 0.0 0.0 1.0]
|
99 |
| - eigvals, eigvecs = eig(m)::Tuple{SVector,SMatrix} |
| 110 | + vals, vecs = eig(m)::Tuple{SVector,SMatrix} |
100 | 111 |
|
101 |
| - @test eigvals ≈ [0.0, 1.0, 2.0] |
102 |
| - @test eigvecs*diagm(eigvals)*eigvecs' ≈ m |
| 112 | + @test vals ≈ [0.0, 1.0, 2.0] |
| 113 | + @test vecs*diagm(vals)*vecs' ≈ m |
| 114 | + @test eigvals(m) ≈ vals |
103 | 115 | end
|
104 | 116 | end
|
0 commit comments