1- using Printf
2- using LinearAlgebra
3- using LinearAlgebra: Givens, Rotation, givens
4-
5- import Base: \
6-
71# Hessenberg Matrix
82struct HessenbergMatrix{T,S<: StridedMatrix } <: AbstractMatrix{T}
93 data:: S
@@ -29,14 +23,6 @@ function LinearAlgebra.ldiv!(H::HessenbergMatrix, B::AbstractVecOrMat)
2923end
3024(\ )(H:: HessenbergMatrix , B:: AbstractVecOrMat ) = ldiv! (copy (H), copy (B))
3125
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-
4026# Hessenberg factorization
4127struct HessenbergFactorization{T,S<: StridedMatrix ,U} <: Factorization{T}
4228 data:: S
@@ -59,7 +45,7 @@ function _hessenberg!(A::StridedMatrix{T}) where {T}
5945 end
6046 return HessenbergFactorization {T,typeof(A),eltype(τ)} (A, τ)
6147end
62- LinearAlgebra . hessenberg! (A:: StridedMatrix ) = _hessenberg! (A)
48+ hessenberg! (A:: StridedMatrix ) = _hessenberg! (A)
6349
6450Base. size (H:: HessenbergFactorization , args... ) = size (H. data, args... )
6551
@@ -179,10 +165,7 @@ function _schur!(
179165
180166 return Schur {T,typeof(HH)} (HH, τ)
181167end
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... )
186169
187170function singleShiftQR! (
188171 HH:: StridedMatrix ,
@@ -278,11 +261,11 @@ function doubleShiftQR!(
278261 return HH
279262end
280263
281- _eigvals! (A:: StridedMatrix ; kwargs... ) = _eigvals! (_schur ! (A; kwargs... ))
264+ _eigvals! (A:: StridedMatrix ; kwargs... ) = _eigvals! (schur ! (A; kwargs... ))
282265_eigvals! (H:: HessenbergMatrix ; kwargs... ) = _eigvals! (_schur! (H; kwargs... ))
283266_eigvals! (H:: HessenbergFactorization ; kwargs... ) = _eigvals! (_schur! (H; kwargs... ))
284267
285- function LinearAlgebra . eigvals! (
268+ function eigvals! (
286269 A:: StridedMatrix ;
287270 sortby:: Union{Function,Nothing} = LinearAlgebra. eigsortby,
288271 kwargs... ,
@@ -294,13 +277,13 @@ function LinearAlgebra.eigvals!(
294277 LinearAlgebra. sorteig! (_eigvals! (A; kwargs... ), sortby)
295278end
296279
297- LinearAlgebra . eigvals! (
280+ eigvals! (
298281 H:: HessenbergMatrix ;
299282 sortby:: Union{Function,Nothing} = LinearAlgebra. eigsortby,
300283 kwargs... ,
301284) = LinearAlgebra. sorteig! (_eigvals! (H; kwargs... ), sortby)
302285
303- LinearAlgebra . eigvals! (
286+ eigvals! (
304287 H:: HessenbergFactorization ;
305288 sortby:: Union{Function,Nothing} = LinearAlgebra. eigsortby,
306289 kwargs... ,
@@ -338,3 +321,17 @@ function _eigvals!(S::Schur{T}; tol = eps(real(T))) where {T}
338321 end
339322 return vals
340323end
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