156
156
eigmax (A:: RealHermSymComplexHerm{<:Real} ) = eigvals (A, size (A, 1 ): size (A, 1 ))[1 ]
157
157
eigmin (A:: RealHermSymComplexHerm{<:Real} ) = eigvals (A, 1 : 1 )[1 ]
158
158
159
+ function eigen (A:: HermOrSym{TA} , B:: HermOrSym{TB} ; kws... ) where {TA,TB}
160
+ S = promote_type (eigtype (TA), TB)
161
+ return eigen! (eigencopy_oftype {S} (A), eigencopy_oftype (B, S); kws... )
162
+ end
163
+
159
164
function eigen! (A:: HermOrSym{T,S} , B:: HermOrSym{T,S} ; sortby:: Union{Function,Nothing} = nothing ) where {T<: BlasReal ,S<: StridedMatrix }
160
165
vals, vecs, _ = LAPACK. sygvd! (1 , ' V' , A. uplo, A. data, B. uplo == A. uplo ? B. data : copy (B. data' ))
161
166
GeneralizedEigen (sorteig! (vals, vecs, sortby)... )
@@ -164,26 +169,32 @@ function eigen!(A::Hermitian{T,S}, B::Hermitian{T,S}; sortby::Union{Function,Not
164
169
vals, vecs, _ = LAPACK. sygvd! (1 , ' V' , A. uplo, A. data, B. uplo == A. uplo ? B. data : copy (B. data' ))
165
170
GeneralizedEigen (sorteig! (vals, vecs, sortby)... )
166
171
end
167
- function eigen! (A:: RealHermSymComplexHerm{T,<:StridedMatrix} , B:: AbstractMatrix{T} ; sortby:: Union{Function,Nothing} = nothing ) where {T<: Number }
168
- return _choleigen! (A, B, sortby)
169
- end
170
- function eigen! (A:: StridedMatrix{T} , B:: Union{RealHermSymComplexHerm{T},Diagonal{T}} ; sortby:: Union{Function,Nothing} = nothing ) where {T<: Number }
171
- return _choleigen! (A, B, sortby)
172
+
173
+ function eigen (A:: AbstractMatrix , C:: Cholesky ; sortby:: Union{Function,Nothing} = nothing )
174
+ if ishermitian (A)
175
+ eigen! (eigencopy_oftype (Hermitian (A), eigtype (eltype (A))), C; sortby)
176
+ else
177
+ eigen! (copy_similar (A, eigtype (eltype (A))), C; sortby)
178
+ end
172
179
end
173
- function _choleigen ! (A, B, sortby)
174
- U = cholesky (B) . U
175
- vals, w = eigen! (UtiAUi! (A, U))
176
- vecs = U \ w
180
+ function eigen ! (A:: AbstractMatrix , C :: Cholesky ; sortby:: Union{Function,Nothing} = nothing )
181
+ # Cholesky decomposition based eigenvalues and eigenvectors
182
+ vals, w = eigen! (UtiAUi! (A, C . U))
183
+ vecs = C . U \ w
177
184
GeneralizedEigen (sorteig! (vals, vecs, sortby)... )
178
185
end
179
186
180
187
# Perform U' \ A / U in-place, where U::Union{UpperTriangular,Diagonal}
181
- UtiAUi! (A:: StridedMatrix , U) = _UtiAUi! (A, U)
188
+ UtiAUi! (A, U) = _UtiAUi! (A, U)
182
189
UtiAUi! (A:: Symmetric , U) = Symmetric (_UtiAUi! (copytri! (parent (A), A. uplo), U), sym_uplo (A. uplo))
183
190
UtiAUi! (A:: Hermitian , U) = Hermitian (_UtiAUi! (copytri! (parent (A), A. uplo, true ), U), sym_uplo (A. uplo))
184
-
185
191
_UtiAUi! (A, U) = rdiv! (ldiv! (U' , A), U)
186
192
193
+ function eigvals (A:: HermOrSym{TA} , B:: HermOrSym{TB} ; kws... ) where {TA,TB}
194
+ S = promote_type (eigtype (TA), TB)
195
+ return eigen! (eigencopy_oftype {S} (A), eigencopy_oftype (B, S); kws... )
196
+ end
197
+
187
198
function eigvals! (A:: HermOrSym{T,S} , B:: HermOrSym{T,S} ; sortby:: Union{Function,Nothing} = nothing ) where {T<: BlasReal ,S<: StridedMatrix }
188
199
vals = LAPACK. sygvd! (1 , ' N' , A. uplo, A. data, B. uplo == A. uplo ? B. data : copy (B. data' ))[1 ]
189
200
isnothing (sortby) || sort! (vals, by= sortby)
@@ -195,3 +206,15 @@ function eigvals!(A::Hermitian{T,S}, B::Hermitian{T,S}; sortby::Union{Function,N
195
206
return vals
196
207
end
197
208
eigvecs (A:: HermOrSym ) = eigvecs (eigen (A))
209
+
210
+ function eigvals (A:: AbstractMatrix , C:: Cholesky ; sortby:: Union{Function,Nothing} = nothing )
211
+ if ishermitian (A)
212
+ eigvals! (eigencopy_oftype (Hermitian (A), eigtype (eltype (A))), C; sortby)
213
+ else
214
+ eigvals! (copy_similar (A, eigtype (eltype (A))), C; sortby)
215
+ end
216
+ end
217
+ function eigvals! (A:: AbstractMatrix{T} , C:: Cholesky{T, <:AbstractMatrix} ; sortby:: Union{Function,Nothing} = nothing ) where {T<: Number }
218
+ # Cholesky decomposition based eigenvalues
219
+ return eigvals! (UtiAUi! (A, C. U); sortby)
220
+ end
0 commit comments