112
112
113
113
114
114
@inline function _eig (s:: Size , A:: StaticMatrix , permute, scale)
115
- # Only cover the hermitian branch, for now ast least
116
- # This also solves some type-stability issues such as arise in Base
115
+ # Only cover the hermitian branch, for now at least
116
+ # This also solves some type-stability issues that arise in Base
117
117
if ishermitian (A)
118
118
return _eig (s, Hermitian (A), permute, scale)
119
119
else
136
136
TA = eltype (A)
137
137
138
138
@inbounds if A. uplo == ' U'
139
- if a[3 ] == 0 # A is diagonal
140
- A11 = a[1 ]
141
- A22 = a[4 ]
142
- if A11 < A22
143
- vals = SVector (A11, A22)
144
- vecs = @SMatrix [convert (TA, 1 ) convert (TA, 0 );
145
- convert (TA, 0 ) convert (TA, 1 )]
146
- else # A22 <= A11
147
- vals = SVector (A22, A11)
148
- vecs = @SMatrix [convert (TA, 0 ) convert (TA, 1 );
149
- convert (TA, 1 ) convert (TA, 0 )]
150
- end
151
- else # A is not diagonal
139
+ if ! iszero (a[3 ]) # A is not diagonal
152
140
t_half = real (a[1 ] + a[4 ]) / 2
153
141
d = real (a[1 ] * a[4 ] - a[3 ]' * a[3 ]) # Should be real
154
142
@@ -168,22 +156,11 @@ end
168
156
169
157
vecs = @SMatrix [ v11 v21 ;
170
158
v12 v22 ]
159
+
160
+ return (vals, vecs)
171
161
end
172
- return (vals, vecs)
173
162
else # A.uplo == 'L'
174
- if a[2 ] == 0 # A is diagonal
175
- A11 = a[1 ]
176
- A22 = a[4 ]
177
- if A11 < A22
178
- vals = SVector (A11, A22)
179
- vecs = @SMatrix [convert (TA, 1 ) convert (TA, 0 );
180
- convert (TA, 0 ) convert (TA, 1 )]
181
- else # A22 <= A11
182
- vals = SVector (A22, A11)
183
- vecs = @SMatrix [convert (TA, 0 ) convert (TA, 1 );
184
- convert (TA, 1 ) convert (TA, 0 )]
185
- end
186
- else # A is not diagonal
163
+ if ! iszero (a[2 ]) # A is not diagonal
187
164
t_half = real (a[1 ] + a[4 ]) / 2
188
165
d = real (a[1 ] * a[4 ] - a[2 ]' * a[2 ]) # Should be real
189
166
203
180
204
181
vecs = @SMatrix [ v11 v21 ;
205
182
v12 v22 ]
183
+
184
+ return (vals,vecs)
206
185
end
207
- return (vals,vecs)
208
186
end
187
+
188
+ # A must be diagonal if we reached this point; treatment of uplo 'L' and 'U' is then identical
189
+ A11 = real (a[1 ])
190
+ A22 = real (a[4 ])
191
+ if A11 < A22
192
+ vals = SVector (A11, A22)
193
+ vecs = @SMatrix [convert (TA, 1 ) convert (TA, 0 );
194
+ convert (TA, 0 ) convert (TA, 1 )]
195
+ else # A22 <= A11
196
+ vals = SVector (A22, A11)
197
+ vecs = @SMatrix [convert (TA, 0 ) convert (TA, 1 );
198
+ convert (TA, 1 ) convert (TA, 0 )]
199
+ end
200
+ return (vals,vecs)
209
201
end
210
202
211
203
# A small part of the code in the following method was inspired by works of David
0 commit comments