@@ -29,45 +29,46 @@ function eigvals!(A::Symmetric{T,<:BandedMatrix{T}}, B::Symmetric{T,<:BandedMatr
2929 eigvals! (A)
3030end
3131
32- # V = G Q
33- struct BandedEigenvectors{T} <: AbstractMatrix{T}
34- G:: Vector{Givens{T}}
35- Q:: Matrix{T}
36- z1:: Vector{T}
37- end
32+ abstract type AbstractBandedEigenvectors{T} <: AbstractMatrix{T} end
3833
39- size (B:: BandedEigenvectors ) = size (B. Q)
40- getindex (B:: BandedEigenvectors , i, j) = Matrix (B)[i,j]
41- function _getindex_vec (B:: BandedEigenvectors{T} , j) where {T}
42- z1 = B. z1
43- z2 = OneElement (one (T), j, size (B,2 ))
34+ getindex (B:: AbstractBandedEigenvectors , i, j) = Matrix (B)[i,j]
35+ function _getindex_vec (B, j)
36+ z1 = _get_scratch (B)
37+ z2 = OneElement (one (eltype (B)), j, size (B,2 ))
4438 mul! (z1, B, z2)
4539end
46- function getindex (B:: BandedEigenvectors , i:: Int , j:: Int )
40+ function getindex (B:: AbstractBandedEigenvectors , i:: Union{ Int, Colon, AbstractVector{Int}} , j:: Int )
4741 z = _getindex_vec (B, j)
4842 z[i]
4943end
50- function getindex (B:: BandedEigenvectors , :: Colon , j:: Int )
51- z = _getindex_vec (B, j)
52- copy (z)
53- end
54- function getindex (B:: BandedEigenvectors , :: Colon , jr:: AbstractVector{<:Int} )
44+ function getindex (B:: AbstractBandedEigenvectors , :: Colon , jr:: AbstractVector{Int} )
5545 M = similar (B, size (B,1 ), length (jr))
5646 for (ind, j) in enumerate (jr)
5747 M[:, ind] = _getindex_vec (B, j)
5848 end
5949 return M
6050end
6151
52+ # V = G Q
53+ struct BandedEigenvectors{T} <: AbstractBandedEigenvectors{T}
54+ G:: Vector{Givens{T}}
55+ Q:: Matrix{T}
56+ z1:: Vector{T} # scratch space, used in indexing
57+ end
58+
59+ size (B:: BandedEigenvectors ) = size (B. Q)
60+
61+ _get_scratch (B:: BandedEigenvectors ) = B. z1
62+
6263# V = S⁻¹ Q W
63- struct BandedGeneralizedEigenvectors{T,M<: AbstractMatrix{T} } <: AbstractMatrix {T}
64+ struct BandedGeneralizedEigenvectors{T,M<: AbstractMatrix{T} } <: AbstractBandedEigenvectors {T}
6465 S:: SplitCholesky{T,M}
6566 Q:: Vector{Givens{T}}
6667 W:: BandedEigenvectors{T}
6768end
6869
6970size (B:: BandedGeneralizedEigenvectors ) = size (B. W)
70- getindex (B:: BandedGeneralizedEigenvectors , i, j ) = Matrix (B)[i, j]
71+ _get_scratch (B:: BandedGeneralizedEigenvectors ) = _get_scratch (B . W)
7172
7273convert (:: Type{Eigen{T, T, Matrix{T}, Vector{T}}} , F:: Eigen{T, T, BandedEigenvectors{T}, Vector{T}} ) where T = Eigen (F. values, Matrix (F. vectors))
7374convert (:: Type{GeneralizedEigen{T, T, Matrix{T}, Vector{T}}} , F:: GeneralizedEigen{T, T, BandedGeneralizedEigenvectors{T}, Vector{T}} ) where T = GeneralizedEigen (F. values, Matrix (F. vectors))
0 commit comments