@@ -110,6 +110,20 @@ function Base.:\(F::Union{LinearAlgebra.LAPACKFactorizations{<:Any,<:CuArray},
110
110
return LinearAlgebra. _cut_B (BB, 1 : n)
111
111
end
112
112
113
+ # Adapted from LinearAlgebra.sorteig!().
114
+ # Warning: not very efficient, but works.
115
+ eigsortby (λ:: Real ) = λ
116
+ eigsortby (λ:: Complex ) = (real (λ),imag (λ))
117
+ function sorteig! (λ:: AbstractVector , X:: AbstractMatrix , sortby:: Union{Function,Nothing} = eigsortby)
118
+ if sortby != = nothing # && !issorted(λ, by=sortby)
119
+ p = sortperm (λ; by= sortby)
120
+ λ .= λ[p] # permute!(λ, p)
121
+ X .= X[:, p] # Base.permutecols!!(X, p)
122
+ end
123
+ return λ, X
124
+ end
125
+ sorteig! (λ:: AbstractVector , sortby:: Union{Function,Nothing} = eigsortby) = sortby === nothing ? λ : sort! (λ, by= sortby)
126
+
113
127
# eigen
114
128
115
129
function LinearAlgebra. eigen (A:: Symmetric{T,<:CuMatrix} ) where {T<: BlasReal }
@@ -127,58 +141,58 @@ end
127
141
function LinearAlgebra. eigen (A:: CuMatrix{T} ) where {T<: BlasReal }
128
142
A2 = copy (A)
129
143
r = Xgeev! (' N' , ' V' , A2)
130
- return Eigen (r[1 ], r[3 ])
144
+ return Eigen (sorteig! ( r[1 ], r[3 ]) ... )
131
145
end
132
146
function LinearAlgebra. eigen (A:: CuMatrix{T} ) where {T<: BlasComplex }
133
147
A2 = copy (A)
134
148
r = Xgeev! (' N' , ' V' , A2)
135
- return Eigen (r[1 ], r[3 ])
149
+ return Eigen (sorteig! ( r[1 ], r[3 ]) ... )
136
150
end
137
151
138
152
# eigvals
139
153
140
154
function LinearAlgebra. eigvals (A:: Symmetric{T, <:CuMatrix} ) where {T <: BlasReal }
141
155
A2 = copy (A. data)
142
- return syevd! (' N' , ' U' , A2)[ 1 ]
156
+ return syevd! (' N' , ' U' , A2)
143
157
end
144
158
function LinearAlgebra. eigvals (A:: Hermitian{T, <:CuMatrix} ) where {T <: BlasComplex }
145
159
A2 = copy (A. data)
146
- return heevd! (' N' , ' U' , A2)[ 1 ]
160
+ return heevd! (' N' , ' U' , A2)
147
161
end
148
162
function LinearAlgebra. eigvals (A:: Hermitian{T, <:CuMatrix} ) where {T <: BlasReal }
149
163
return eigvals (Symmetric (A))
150
164
end
151
165
152
166
function LinearAlgebra. eigvals (A:: CuMatrix{T} ) where {T <: BlasReal }
153
167
A2 = copy (A)
154
- return Xgeev! (' N' , ' N' , A2)[1 ]
168
+ return sorteig! ( Xgeev! (' N' , ' N' , A2)[1 ])
155
169
end
156
170
function LinearAlgebra. eigvals (A:: CuMatrix{T} ) where {T <: BlasComplex }
157
171
A2 = copy (A)
158
- return Xgeev! (' N' , ' N' , A2)[1 ]
172
+ return sorteig! ( Xgeev! (' N' , ' N' , A2)[1 ])
159
173
end
160
174
161
175
# eigvecs
162
176
163
177
function LinearAlgebra. eigvecs (A:: Symmetric{T, <:CuMatrix} ) where {T <: BlasReal }
164
- A2 = copy (A . data )
165
- return syevd! ( ' V ' , ' U ' , A2)[ 2 ]
178
+ E = eigen (A )
179
+ return E . vectors
166
180
end
167
181
function LinearAlgebra. eigvecs (A:: Hermitian{T, <:CuMatrix} ) where {T <: BlasComplex }
168
- A2 = copy (A . data )
169
- return heevd! ( ' V ' , ' U ' , A2)[ 2 ]
182
+ E = eigen (A )
183
+ return E . vectors
170
184
end
171
185
function LinearAlgebra. eigvecs (A:: Hermitian{T, <:CuMatrix} ) where {T <: BlasReal }
172
186
return eigvecs (Symmetric (A))
173
187
end
174
188
175
189
function LinearAlgebra. eigvecs (A:: CuMatrix{T} ) where {T <: BlasReal }
176
- A2 = copy (A)
177
- return Xgeev! ( ' N ' , ' V ' , A2)[ 3 ]
190
+ E = eigen (A)
191
+ return E . vectors
178
192
end
179
193
function LinearAlgebra. eigvecs (A:: CuMatrix{T} ) where {T <: BlasComplex }
180
- A2 = copy (A)
181
- return Xgeev! ( ' N ' , ' V ' , A2)[ 3 ]
194
+ E = eigen (A)
195
+ return E . vectors
182
196
end
183
197
184
198
# factorizations
0 commit comments