|
2 | 2 | struct BandedEigenvectors{T} <: AbstractMatrix{T}
|
3 | 3 | G::Vector{Givens{T}}
|
4 | 4 | Q::Matrix{T}
|
| 5 | + z1::Vector{T} |
| 6 | + z2::Vector{T} |
5 | 7 | end
|
6 | 8 |
|
7 | 9 | size(B::BandedEigenvectors) = size(B.Q)
|
8 |
| -getindex(B::BandedEigenvectors, i, j) = Matrix(B)[i, j] |
| 10 | +getindex(B::BandedEigenvectors, i, j) = Matrix(B)[i,j] |
| 11 | +function _getindex_vec(B::BandedEigenvectors{T}, j) where {T} |
| 12 | + z1, z2 = B.z1, B.z2 |
| 13 | + z2 .= zero(T) |
| 14 | + z2[j] = oneunit(T) |
| 15 | + mul!(z1, B, z2) |
| 16 | +end |
| 17 | +function getindex(B::BandedEigenvectors, i::Int, j::Int) |
| 18 | + z = _getindex_vec(B, j) |
| 19 | + z[i] |
| 20 | +end |
| 21 | +function getindex(B::BandedEigenvectors, ::Colon, j::Int) |
| 22 | + z = _getindex_vec(B, j) |
| 23 | + copy(z) |
| 24 | +end |
| 25 | +function getindex(B::BandedEigenvectors, ::Colon, jr::AbstractVector{<:Int}) |
| 26 | + M = similar(B, size(B,1), length(jr)) |
| 27 | + for (ind, j) in enumerate(jr) |
| 28 | + M[:, ind] = _getindex_vec(B, j) |
| 29 | + end |
| 30 | + return M |
| 31 | +end |
9 | 32 |
|
10 | 33 | # V = S⁻¹ Q W
|
11 | 34 | struct BandedGeneralizedEigenvectors{T,M<:AbstractMatrix{T}} <: AbstractMatrix{T}
|
@@ -39,7 +62,7 @@ function eigen!(A::Symmetric{T,<:BandedMatrix{T}}) where T <: Real
|
39 | 62 | AB = symbandeddata(A)
|
40 | 63 | sbtrd!('V', A.uplo, N, KD, AB, D, E, G, WORK)
|
41 | 64 | Λ, Q = eigen(SymTridiagonal(D, E))
|
42 |
| - Eigen(Λ, BandedEigenvectors(G, Q)) |
| 65 | + Eigen(Λ, BandedEigenvectors(G, Q, similar(Q, size(Q,1)), similar(Q, size(Q,2)))) |
43 | 66 | end
|
44 | 67 |
|
45 | 68 | function eigen!(A::Symmetric{T,<:BandedMatrix{T}}, B::Symmetric{T,<:BandedMatrix{T}}) where T <: Real
|
|
0 commit comments