Skip to content

Commit 6827170

Browse files
Eveyfredrikekre
authored andcommitted
Add diagonal branch to eigfact (#24550)
* Add diagonal branch to eigfact * Promote to type S
1 parent 91f697c commit 6827170

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

base/linalg/diagonal.jl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,12 @@ end
408408
eigvals(D::Diagonal{<:Number}) = D.diag
409409
eigvals(D::Diagonal) = [eigvals(x) for x in D.diag] #For block matrices, etc.
410410
eigvecs(D::Diagonal) = Matrix{eltype(D)}(I, size(D))
411-
eigfact(D::Diagonal) = Eigen(eigvals(D), eigvecs(D))
411+
function eigfact(D::Diagonal; permute::Bool=true, scale::Bool=true)
412+
if any(!isfinite, D.diag)
413+
throw(ArgumentError("matrix contains Infs or NaNs"))
414+
end
415+
Eigen(eigvals(D), eigvecs(D))
416+
end
412417

413418
#Singular system
414419
svdvals(D::Diagonal{<:Number}) = sort!(abs.(D.diag), rev = true)

base/linalg/eigen.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,9 @@ julia> F[:vectors]
9999
"""
100100
function eigfact(A::StridedMatrix{T}; permute::Bool=true, scale::Bool=true) where T
101101
S = promote_type(Float32, typeof(one(T)/norm(one(T))))
102-
eigfact!(copy_oftype(A, S), permute = permute, scale = scale)
102+
AA = copy_oftype(A, S)
103+
isdiag(AA) && return eigfact(Diagonal(AA), permute = permute, scale = scale)
104+
return eigfact!(AA, permute = permute, scale = scale)
103105
end
104106
eigfact(x::Number) = Eigen([x], fill(one(x), 1, 1))
105107

0 commit comments

Comments
 (0)