@@ -2,9 +2,6 @@ using Printf
2
2
using LinearAlgebra
3
3
using LinearAlgebra: Givens, Rotation
4
4
5
- import Base: copy, getindex, size
6
- import LinearAlgebra: eigvals!, ldiv!
7
-
8
5
# Auxiliary
9
6
function adiagmax (A:: StridedMatrix )
10
7
adm = zero (typeof (real (A[1 ])))
@@ -21,14 +18,14 @@ struct HessenbergMatrix{T,S<:StridedMatrix} <: AbstractMatrix{T}
21
18
data:: S
22
19
end
23
20
24
- copy (H:: HessenbergMatrix{T,S} ) where {T,S} = HessenbergMatrix {T,S} (copy (H. data))
21
+ Base . copy (H:: HessenbergMatrix{T,S} ) where {T,S} = HessenbergMatrix {T,S} (copy (H. data))
25
22
26
- getindex (H:: HessenbergMatrix{T,S} , i:: Integer , j:: Integer ) where {T,S} = i > j + 1 ? zero (T) : H. data[i,j]
23
+ Base . getindex (H:: HessenbergMatrix{T,S} , i:: Integer , j:: Integer ) where {T,S} = i > j + 1 ? zero (T) : H. data[i,j]
27
24
28
- size (H:: HessenbergMatrix ) = size (H. data)
29
- size (H:: HessenbergMatrix , i:: Integer ) = size (H. data, i)
25
+ Base . size (H:: HessenbergMatrix ) = size (H. data)
26
+ Base . size (H:: HessenbergMatrix , i:: Integer ) = size (H. data, i)
30
27
31
- function ldiv! (H:: HessenbergMatrix , B:: AbstractVecOrMat )
28
+ function LinearAlgebra . ldiv! (H:: HessenbergMatrix , B:: AbstractVecOrMat )
32
29
n = size (H, 1 )
33
30
Hd = H. data
34
31
for i = 1 : n- 1
@@ -45,7 +42,7 @@ struct HessenbergFactorization{T, S<:StridedMatrix,U} <: Factorization{T}
45
42
τ:: Vector{U}
46
43
end
47
44
48
- function hessfact ! (A:: StridedMatrix{T} ) where T
45
+ function _hessenberg ! (A:: StridedMatrix{T} ) where T
49
46
n = LinearAlgebra. checksquare (A)
50
47
τ = Vector {Householder{T}} (undef, n - 1 )
51
48
for i = 1 : n - 1
@@ -58,8 +55,9 @@ function hessfact!(A::StridedMatrix{T}) where T
58
55
end
59
56
return HessenbergFactorization {T, typeof(A), eltype(τ)} (A, τ)
60
57
end
58
+ LinearAlgebra. hessenberg! (A:: StridedMatrix ) = _hessenberg! (A)
61
59
62
- size (H:: HessenbergFactorization , args... ) = size (H. data, args... )
60
+ Base . size (H:: HessenbergFactorization , args... ) = size (H. data, args... )
63
61
64
62
# Schur
65
63
struct Schur{T,S<: StridedMatrix } <: Factorization{T}
@@ -73,8 +71,8 @@ function wilkinson(Hmm, t, d)
73
71
return ifelse (abs (Hmm - λ1) < abs (Hmm - λ2), λ1, λ2)
74
72
end
75
73
76
-
77
- function schurfact ! (H:: HessenbergFactorization{T} ; tol = eps (T), debug = false , shiftmethod = :Wilkinson , maxiter = 100 * size (H, 1 )) where T<: Real
74
+ # We currently absorb extra unsupported keywords in kwargs. These could e.g. be scale and permute. Do we want to check that these are false?
75
+ function _schur ! (H:: HessenbergFactorization{T} ; tol = eps (T), debug = false , shiftmethod = :Wilkinson , maxiter = 100 * size (H, 1 ), kwargs ... ) where T<: Real
78
76
n = size (H, 1 )
79
77
istart = 1
80
78
iend = n
@@ -143,7 +141,8 @@ function schurfact!(H::HessenbergFactorization{T}; tol = eps(T), debug = false,
143
141
144
142
return Schur {T,typeof(HH)} (HH, τ)
145
143
end
146
- schurfact! (A:: StridedMatrix ; kwargs... ) = schurfact! (hessfact! (A); kwargs... )
144
+ _schur! (A:: StridedMatrix ; kwargs... ) = _schur! (_hessenberg! (A); kwargs... )
145
+ LinearAlgebra. schur! (A:: StridedMatrix ; kwargs... ) = _schur! (A; kwargs... )
147
146
148
147
function singleShiftQR! (HH:: StridedMatrix , τ:: Rotation , shift:: Number , istart:: Integer , iend:: Integer )
149
148
m = size (HH, 1 )
@@ -219,11 +218,16 @@ function doubleShiftQR!(HH::StridedMatrix, τ::Rotation, shiftTrace::Number, shi
219
218
return HH
220
219
end
221
220
222
- eigvals ! (A:: StridedMatrix ; kwargs... ) = eigvals! ( schurfact ! (A; kwargs... ))
223
- eigvals ! (H:: HessenbergMatrix ; kwargs... ) = eigvals! ( schurfact ! (H, kwargs... ))
224
- eigvals ! (H:: HessenbergFactorization ; kwargs... ) = eigvals! ( schurfact ! (H, kwargs... ))
221
+ _eigvals ! (A:: StridedMatrix ; kwargs... ) = _eigvals! ( _schur ! (A; kwargs... ))
222
+ _eigvals ! (H:: HessenbergMatrix ; kwargs... ) = _eigvals! ( _schur ! (H, kwargs... ))
223
+ _eigvals ! (H:: HessenbergFactorization ; kwargs... ) = _eigvals! ( _schur ! (H, kwargs... ))
225
224
226
- function eigvals! (S:: Schur{T} ; tol = eps (T)) where T
225
+ # Overload methods from LinearAlgebra to make them work generically
226
+ LinearAlgebra. eigvals! (A:: StridedMatrix ; kwargs... ) = _eigvals! (A; kwargs... )
227
+ LinearAlgebra. eigvals! (H:: HessenbergMatrix ; kwargs... ) = _eigvals! (H, kwargs... )
228
+ LinearAlgebra. eigvals! (H:: HessenbergFactorization ; kwargs... ) = _eigvals! (H, kwargs... )
229
+
230
+ function _eigvals! (S:: Schur{T} ; tol = eps (T)) where T
227
231
HH = S. data
228
232
n = size (HH, 1 )
229
233
vals = Vector {Complex{T}} (undef, n)
@@ -244,6 +248,8 @@ function eigvals!(S::Schur{T}; tol = eps(T)) where T
244
248
i += 2
245
249
end
246
250
end
247
- if i == n vals[i] = HH[n, n] end
251
+ if i == n
252
+ vals[i] = HH[n, n]
253
+ end
248
254
return vals
249
255
end
0 commit comments