Skip to content

Commit 17b004c

Browse files
committed
diagonal eig outputs sorted values
1 parent c255dad commit 17b004c

1 file changed

Lines changed: 15 additions & 4 deletions

File tree

src/implementations/eig.jl

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,17 +129,28 @@ end
129129

130130
# Diagonal logic
131131
# --------------
132-
function eig_full!(A::Diagonal, (D, V)::Tuple{Diagonal, Diagonal}, alg::DiagonalAlgorithm)
133-
check_input(eig_full!, A, (D, V), alg)
134-
D === A || copy!(D, A)
135-
one!(V)
132+
function eig_full!(A::Diagonal, DV, alg::DiagonalAlgorithm)
133+
check_input(eig_full!, A, DV, alg)
134+
D, V = DV
135+
diagA = diagview(A)
136+
I = sortperm(diagA; by = real)
137+
if D === A
138+
permute!(diagA, I)
139+
else
140+
diagview(D) .= view(diagA, I)
141+
end
142+
zero!(V)
143+
n = size(A, 1)
144+
I .+= (0:(n - 1)) .* n
145+
V[I] .= Ref(one(eltype(V)))
136146
return D, V
137147
end
138148

139149
function eig_vals!(A::Diagonal, D::AbstractVector, alg::DiagonalAlgorithm)
140150
check_input(eig_vals!, A, D, alg)
141151
Ad = diagview(A)
142152
D === Ad || copy!(D, Ad)
153+
sort!(D; by = real)
143154
return D
144155
end
145156

0 commit comments

Comments
 (0)