@@ -160,7 +160,7 @@ function eigQL2x2!(d::StridedVector, e::StridedVector, j::Integer, vectors::Matr
160
160
return c, s
161
161
end
162
162
163
- function eigvalsPWK! (S:: SymTridiagonal{T} , tol = eps (T), debug:: Bool = false ) where T<: Real
163
+ function eigvalsPWK! (S:: SymTridiagonal{T} ; tol = eps (T), debug:: Bool = false ) where T<: Real
164
164
d = S. dv
165
165
e = S. ev
166
166
n = length (d)
@@ -180,6 +180,7 @@ function eigvalsPWK!(S::SymTridiagonal{T}, tol = eps(T), debug::Bool=false) wher
180
180
end
181
181
blockend = n
182
182
end
183
+
183
184
# Deflate?
184
185
if blockstart == blockend
185
186
# Yes
@@ -201,15 +202,15 @@ function eigvalsPWK!(S::SymTridiagonal{T}, tol = eps(T), debug::Bool=false) wher
201
202
202
203
debug && @printf (" QL, blockstart: %d, blockend: %d, e[blockstart]: %e, e[blockend-1]:%e, μ: %e, rotations: %d\n " , blockstart, blockend, e[blockstart], e[blockend- 1 ], μ, iter += blockend - blockstart)
203
204
end
204
- if blockstart = = n
205
+ if blockstart > = n
205
206
break
206
207
end
207
208
end
208
209
end
209
210
sort! (d)
210
211
end
211
212
212
- function eigQL! (S:: SymTridiagonal{T} ,
213
+ function eigQL! (S:: SymTridiagonal{T} ;
213
214
vectors:: Matrix = zeros (T, 0 , size (S, 1 )),
214
215
tol = eps (T),
215
216
debug:: Bool = false ) where T<: Real
@@ -254,7 +255,7 @@ function eigQL!(S::SymTridiagonal{T},
254
255
singleShiftQL! (S, μ, blockstart, blockend, vectors)
255
256
debug && @printf (" QL, blockstart: %d, blockend: %d, e[blockstart]: %e, e[blockend-1]:%e, μ: %f\n " , blockstart, blockend, e[blockstart], e[blockend- 1 ], μ)
256
257
end
257
- if blockstart = = n
258
+ if blockstart > = n
258
259
break
259
260
end
260
261
end
@@ -263,7 +264,7 @@ function eigQL!(S::SymTridiagonal{T},
263
264
return d[p], vectors[:,p]
264
265
end
265
266
266
- function eigQR! (S:: SymTridiagonal{T} ,
267
+ function eigQR! (S:: SymTridiagonal{T} ;
267
268
vectors:: Matrix = zeros (T, 0 , size (S, 1 )),
268
269
tol = eps (T),
269
270
debug:: Bool = false ) where T<: Real
@@ -301,7 +302,7 @@ function eigQR!(S::SymTridiagonal{T},
301
302
302
303
debug && @printf (" QR, blockstart: %d, blockend: %d, e[blockstart]: %e, e[blockend-1]:%e, d[blockend]: %f, μ: %f\n " , blockstart, blockend, e[blockstart], e[blockend- 1 ], d[blockend], μ)
303
304
end
304
- if blockstart = = n
305
+ if blockstart > = n
305
306
break
306
307
end
307
308
end
@@ -527,40 +528,89 @@ function symtriUpper!(AS::StridedMatrix{T},
527
528
SymmetricTridiagonalFactorization (' U' , AS, τ, SymTridiagonal (real (diag (AS)), real (diag (AS, 1 ))))
528
529
end
529
530
530
- _eigvals! (A:: SymmetricTridiagonalFactorization ) = eigvalsPWK! (A. diagonals, eps (eltype (A. diagonals)), false )
531
- _eigvals! (A:: SymTridiagonal ) = eigvalsPWK! (A, eps (eltype (A)) , false )
532
- _eigvals! (A:: Hermitian ) = eigvals! (symtri! (A))
533
531
534
- LinearAlgebra. eigvals! (A:: SymmetricTridiagonalFactorization ) = _eigvals! (A)
535
- LinearAlgebra. eigvals! (A:: SymTridiagonal ) = _eigvals! (A)
536
- LinearAlgebra. eigvals! (A:: Hermitian ) = _eigvals! (A)
532
+ _eigvals! (A:: SymmetricTridiagonalFactorization ;
533
+ tol = eps (real (eltype (A))),
534
+ debug = false ) = eigvalsPWK! (A. diagonals, tol = tol, debug = debug)
535
+
536
+ _eigvals! (A:: SymTridiagonal ;
537
+ tol = eps (real (eltype (A))),
538
+ debug = false ) = eigvalsPWK! (A, tol = tol, debug = debug)
539
+
540
+ _eigvals! (A:: Hermitian ;
541
+ tol = eps (real (eltype (A))),
542
+ debug = false ) = eigvals! (symtri! (A), tol = tol, debug = debug)
543
+
544
+
545
+ LinearAlgebra. eigvals! (A:: SymmetricTridiagonalFactorization ;
546
+ tol = eps (real (eltype (A))),
547
+ debug = false ) = _eigvals! (A, tol = tol, debug = debug)
548
+
549
+ LinearAlgebra. eigvals! (A:: SymTridiagonal ;
550
+ tol = eps (real (eltype (A))),
551
+ debug = false ) = _eigvals! (A, tol = tol, debug = debug)
552
+
553
+ LinearAlgebra. eigvals! (A:: Hermitian ;
554
+ tol = eps (real (eltype (A))),
555
+ debug = false ) = _eigvals! (A, tol = tol, debug = debug)
556
+
557
+
558
+ _eigen! (A:: SymmetricTridiagonalFactorization ;
559
+ tol = eps (real (eltype (A))),
560
+ debug = false ) =
561
+ LinearAlgebra. Eigen (eigQL! (A. diagonals, vectors = Array (A. Q), tol = tol, debug = debug)... )
537
562
538
- _eigen! (A:: SymmetricTridiagonalFactorization ) =
539
- LinearAlgebra. Eigen (eigQL! (A. diagonals, Array (A. Q), eps (eltype (A. diagonals)), false )... )
540
- _eigen! (A:: SymTridiagonal ) =
541
- LinearAlgebra. Eigen (eigQL! (A, Matrix {eltype(A)} (I, size (A, 1 ), size (A, 1 )), eps (eltype (A)), false )... )
542
- _eigen! (A:: Hermitian ) = _eigen! (symtri! (A))
563
+ _eigen! (A:: SymTridiagonal ;
564
+ tol = eps (real (eltype (A))),
565
+ debug = false ) =
566
+ LinearAlgebra. Eigen (eigQL! (A, vectors = Matrix {eltype(A)} (I, size (A, 1 ), size (A, 1 )), tol = tol, debug = debug)... )
543
567
544
- LinearAlgebra . eigen ! (A:: SymmetricTridiagonalFactorization ) = _eigen! (A)
545
- LinearAlgebra . eigen! (A :: SymTridiagonal ) = _eigen! (A)
546
- LinearAlgebra . eigen! (A :: Hermitian ) = _eigen! (A )
568
+ _eigen ! (A:: Hermitian ;
569
+ tol = eps ( real ( eltype (A))),
570
+ debug = false ) = _eigen! ( symtri! (A), tol = tol, debug = debug )
547
571
548
- function eigen2! (A:: SymmetricTridiagonalFactorization , tol = eps (real (float (one (eltype (A))))), debug = false )
572
+
573
+ LinearAlgebra. eigen! (A:: SymmetricTridiagonalFactorization ;
574
+ tol = eps (real (eltype (A))),
575
+ debug = false ) = _eigen! (A, tol = tol, debug = debug)
576
+
577
+ LinearAlgebra. eigen! (A:: SymTridiagonal ;
578
+ tol = eps (real (eltype (A))),
579
+ debug = false ) = _eigen! (A, tol = tol, debug = debug)
580
+
581
+ LinearAlgebra. eigen! (A:: Hermitian ;
582
+ tol = eps (real (eltype (A))),
583
+ debug = false ) = _eigen! (A, tol = tol, debug = debug)
584
+
585
+
586
+ function eigen2! (A:: SymmetricTridiagonalFactorization ;
587
+ tol = eps (real (float (one (eltype (A))))),
588
+ debug = false )
549
589
V = zeros (eltype (A), 2 , size (A, 1 ))
550
590
V[1 ] = 1
551
591
V[end ] = 1
552
- eigQL! (A. diagonals, rmul! (V, A. Q), tol, debug)
592
+ eigQL! (A. diagonals, vectors = rmul! (V, A. Q), tol = tol, debug = debug)
553
593
end
554
- function eigen2! (A:: SymTridiagonal , tol = eps (real (float (one (eltype (A))))), debug = false )
594
+
595
+ function eigen2! (A:: SymTridiagonal ;
596
+ tol = eps (real (float (one (eltype (A))))),
597
+ debug = false )
555
598
V = zeros (eltype (A), 2 , size (A, 1 ))
556
599
V[1 ] = 1
557
600
V[end ] = 1
558
- eigQL! (A, V, tol, debug)
601
+ eigQL! (A, vectors = V, tol = tol, debug = debug)
559
602
end
560
- eigen2! (A:: Hermitian , tol = eps (float (real (one (eltype (A))))), debug = false ) = eigen2! (symtri! (A), tol, debug)
561
603
562
- eigen2 (A:: SymTridiagonal , tol = eps (float (real (one (eltype (A))))), debug = false ) = eigen2! (copy (A), tol, debug)
563
- eigen2 (A:: Hermitian , tol = eps (float (real (one (eltype (A))))), debug = false ) = eigen2! (copy (A), tol, debug)
604
+ eigen2! (A:: Hermitian ;
605
+ tol = eps (float (real (one (eltype (A))))),
606
+ debug = false ) = eigen2! (symtri! (A), tol = tol, debug = debug)
607
+
608
+
609
+ eigen2 (A:: SymTridiagonal ;
610
+ tol = eps (float (real (one (eltype (A))))),
611
+ debug = false ) = eigen2! (copy (A), tol = tol, debug = debug)
612
+
613
+ eigen2 (A:: Hermitian , tol = eps (float (real (one (eltype (A))))), debug = false ) = eigen2! (copy (A), tol = tol, debug = debug)
564
614
565
615
# First method of each type here is identical to the method defined in
566
616
# LinearAlgebra but is needed for disambiguation
0 commit comments