@@ -159,48 +159,26 @@ end
159
159
@inline function _eig (:: Size{(2,2)} , A:: LinearAlgebra.RealHermSymComplexHerm{T} , permute, scale) where {T <: Real }
160
160
a = A. data
161
161
TA = eltype (A)
162
- @inbounds if A. uplo == ' U'
163
- if ! iszero (a[3 ]) # A is not diagonal
164
- t_half = real (a[1 ] + a[4 ]) / 2
165
- tmp = norm (SVector ((a[1 ] - a[4 ])/ 2 , a[3 ]' ))
166
- vals = SVector (t_half - tmp, t_half + tmp)
167
-
168
- v11 = vals[1 ] - a[4 ]
169
- n1 = sqrt (v11' * v11 + a[3 ]' * a[3 ])
170
- v11 = v11 / n1
171
- v12 = a[3 ]' / n1
172
-
173
- v21 = vals[2 ] - a[4 ]
174
- n2 = sqrt (v21' * v21 + a[3 ]' * a[3 ])
175
- v21 = v21 / n2
176
- v22 = a[3 ]' / n2
177
-
178
- vecs = @SMatrix [ v11 v21 ;
179
- v12 v22 ]
180
-
181
- return Eigen (vals, vecs)
182
- end
183
- else # A.uplo == 'L'
184
- if ! iszero (a[2 ]) # A is not diagonal
185
- t_half = real (a[1 ] + a[4 ]) / 2
186
- tmp = norm (SVector ((a[1 ] - a[4 ])/ 2 , a[2 ]))
187
- vals = SVector (t_half - tmp, t_half + tmp)
188
-
189
- v11 = vals[1 ] - a[4 ]
190
- n1 = sqrt (v11' * v11 + a[2 ]' * a[2 ])
191
- v11 = v11 / n1
192
- v12 = a[2 ] / n1
193
-
194
- v21 = vals[2 ] - a[4 ]
195
- n2 = sqrt (v21' * v21 + a[2 ]' * a[2 ])
196
- v21 = v21 / n2
197
- v22 = a[2 ] / n2
198
-
199
- vecs = @SMatrix [ v11 v21 ;
200
- v12 v22 ]
201
-
202
- return Eigen (vals,vecs)
203
- end
162
+ @inbounds a21 = A. uplo == ' U' ? a[3 ]' : a[2 ]
163
+ @inbounds if ! iszero (a21) # A is not diagonal
164
+ t_half = real (a[1 ] + a[4 ]) / 2
165
+ diag_avg_diff = (a[1 ] - a[4 ])/ 2
166
+ tmp = norm (SVector (diag_avg_diff, a21))
167
+ vals = SVector (t_half - tmp, t_half + tmp)
168
+ v11 = - tmp + diag_avg_diff
169
+ n1 = sqrt (v11' * v11 + a21 * a21' )
170
+ v11 = v11 / n1
171
+ v12 = a21 / n1
172
+
173
+ v21 = tmp + diag_avg_diff
174
+ n2 = sqrt (v21' * v21 + a21 * a21' )
175
+ v21 = v21 / n2
176
+ v22 = a21 / n2
177
+
178
+ vecs = @SMatrix [ v11 v21 ;
179
+ v12 v22 ]
180
+
181
+ return Eigen (vals, vecs)
204
182
end
205
183
206
184
# A must be diagonal if we reached this point; treatment of uplo 'L' and 'U' is then identical
0 commit comments