Skip to content

Commit 59687c7

Browse files
jishnubstaticfloat
authored andcommitted
Create a copy while evaluating eigvals(::Diagonal) (#45048)
(cherry picked from commit b9d8280)
1 parent c86451f commit 59687c7

File tree

2 files changed

+8
-1
lines changed

2 files changed

+8
-1
lines changed

stdlib/LinearAlgebra/src/diagonal.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,7 @@ function pinv(D::Diagonal{T}, tol::Real) where T
659659
end
660660

661661
#Eigensystem
662-
eigvals(D::Diagonal{<:Number}; permute::Bool=true, scale::Bool=true) = D.diag
662+
eigvals(D::Diagonal{<:Number}; permute::Bool=true, scale::Bool=true) = copy(D.diag)
663663
eigvals(D::Diagonal; permute::Bool=true, scale::Bool=true) =
664664
[eigvals(x) for x in D.diag] #For block matrices, etc.
665665
eigvecs(D::Diagonal) = Matrix{eltype(D)}(I, size(D))

stdlib/LinearAlgebra/test/diagonal.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,13 @@ end
403403
@test sort([eigvals(D)...;], by=LinearAlgebra.eigsortby) eigvals([D.diag[1] zeros(3,2); zeros(2,3) D.diag[2]])
404404
end
405405

406+
@testset "eigvals should return a copy of the diagonal" begin
407+
D = Diagonal([1, 2, 3])
408+
lam = eigvals(D)
409+
D[3,3] = 4 # should not affect lam
410+
@test lam == [1, 2, 3]
411+
end
412+
406413
@testset "eigmin (#27847)" begin
407414
for _ in 1:100
408415
d = randn(rand(1:10))

0 commit comments

Comments
 (0)