1
- using Printf
2
- using LinearAlgebra
3
- using LinearAlgebra: Givens, Rotation, givens
4
-
5
- import Base: \
6
-
7
1
# Hessenberg Matrix
8
2
struct HessenbergMatrix{T,S<: StridedMatrix } <: AbstractMatrix{T}
9
3
data:: S
@@ -29,14 +23,6 @@ function LinearAlgebra.ldiv!(H::HessenbergMatrix, B::AbstractVecOrMat)
29
23
end
30
24
(\ )(H:: HessenbergMatrix , B:: AbstractVecOrMat ) = ldiv! (copy (H), copy (B))
31
25
32
- if VERSION < v " 1.10"
33
- # ensure tests pass on Julia v1.6
34
- copy_similar (A:: AbstractArray , :: Type{T} ) where {T} = copyto! (similar (A, T, size (A)), A)
35
- eigtype (T) = promote_type (Float32, typeof (zero (T)/ sqrt (abs2 (one (T)))))
36
- eigencopy_oftype (A, S) = copy_similar (A, S)
37
- LinearAlgebra. eigvals (A:: HessenbergMatrix{T} ; kws... ) where T = LinearAlgebra. eigvals! (eigencopy_oftype (A, eigtype (T)); kws... )
38
- end
39
-
40
26
# Hessenberg factorization
41
27
struct HessenbergFactorization{T,S<: StridedMatrix ,U} <: Factorization{T}
42
28
data:: S
@@ -59,7 +45,7 @@ function _hessenberg!(A::StridedMatrix{T}) where {T}
59
45
end
60
46
return HessenbergFactorization {T,typeof(A),eltype(τ)} (A, τ)
61
47
end
62
- LinearAlgebra . hessenberg! (A:: StridedMatrix ) = _hessenberg! (A)
48
+ hessenberg! (A:: StridedMatrix ) = _hessenberg! (A)
63
49
64
50
Base. size (H:: HessenbergFactorization , args... ) = size (H. data, args... )
65
51
@@ -179,10 +165,7 @@ function _schur!(
179
165
180
166
return Schur {T,typeof(HH)} (HH, τ)
181
167
end
182
- _schur! (A:: StridedMatrix ; kwargs... ) = _schur! (_hessenberg! (A); kwargs... )
183
-
184
- # FIXME ! Move this method to piracy extension
185
- LinearAlgebra. schur! (A:: StridedMatrix ; kwargs... ) = _schur! (A; kwargs... )
168
+ schur! (A:: StridedMatrix ; kwargs... ) = _schur! (_hessenberg! (A); kwargs... )
186
169
187
170
function singleShiftQR! (
188
171
HH:: StridedMatrix ,
@@ -278,11 +261,11 @@ function doubleShiftQR!(
278
261
return HH
279
262
end
280
263
281
- _eigvals! (A:: StridedMatrix ; kwargs... ) = _eigvals! (_schur ! (A; kwargs... ))
264
+ _eigvals! (A:: StridedMatrix ; kwargs... ) = _eigvals! (schur ! (A; kwargs... ))
282
265
_eigvals! (H:: HessenbergMatrix ; kwargs... ) = _eigvals! (_schur! (H; kwargs... ))
283
266
_eigvals! (H:: HessenbergFactorization ; kwargs... ) = _eigvals! (_schur! (H; kwargs... ))
284
267
285
- function LinearAlgebra . eigvals! (
268
+ function eigvals! (
286
269
A:: StridedMatrix ;
287
270
sortby:: Union{Function,Nothing} = LinearAlgebra. eigsortby,
288
271
kwargs... ,
@@ -294,13 +277,13 @@ function LinearAlgebra.eigvals!(
294
277
LinearAlgebra. sorteig! (_eigvals! (A; kwargs... ), sortby)
295
278
end
296
279
297
- LinearAlgebra . eigvals! (
280
+ eigvals! (
298
281
H:: HessenbergMatrix ;
299
282
sortby:: Union{Function,Nothing} = LinearAlgebra. eigsortby,
300
283
kwargs... ,
301
284
) = LinearAlgebra. sorteig! (_eigvals! (H; kwargs... ), sortby)
302
285
303
- LinearAlgebra . eigvals! (
286
+ eigvals! (
304
287
H:: HessenbergFactorization ;
305
288
sortby:: Union{Function,Nothing} = LinearAlgebra. eigsortby,
306
289
kwargs... ,
@@ -338,3 +321,17 @@ function _eigvals!(S::Schur{T}; tol = eps(real(T))) where {T}
338
321
end
339
322
return vals
340
323
end
324
+
325
+ # # eigen!
326
+ function eigen! (
327
+ A:: StridedMatrix ;
328
+ sortby:: Union{Function,Nothing} = LinearAlgebra. eigsortby,
329
+ kwargs... ,
330
+ )
331
+
332
+ if ishermitian (A)
333
+ return eigen! (Hermitian (A); sortby)
334
+ end
335
+
336
+ throw (ArgumentError (" eigen! for general matrices not yet supported. Consider using schur!" ))
337
+ end
0 commit comments