From 1e6183bbc5ec8beb5ece53a7a6e61c8b0845cd64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateus=20Ara=C3=BAjo?= Date: Sun, 15 Dec 2024 20:56:53 +0100 Subject: [PATCH 1/2] avoid division by zero in svd(::Diagonal) --- src/diagonal.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/diagonal.jl b/src/diagonal.jl index ec1cd89c..6c532028 100644 --- a/src/diagonal.jl +++ b/src/diagonal.jl @@ -1024,7 +1024,7 @@ function svd(D::Diagonal{T}) where {T<:Number} Vt = copy(U) for i in 1:length(d) j = piv[i] - U[j,i] = d[j] / S[i] + U[j,i] = iszero(d[j]) ? oneunit(Td) : d[j] / S[i] Vt[i,j] = one(Td) end return SVD(U, S, Vt) From bb5f566534c669c88a804fb38e6a9997fffa4d2d Mon Sep 17 00:00:00 2001 From: araujoms Date: Mon, 16 Dec 2024 09:31:37 +0100 Subject: [PATCH 2/2] add test --- src/diagonal.jl | 2 +- test/diagonal.jl | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/diagonal.jl b/src/diagonal.jl index 6c532028..280caec1 100644 --- a/src/diagonal.jl +++ b/src/diagonal.jl @@ -1025,7 +1025,7 @@ function svd(D::Diagonal{T}) where {T<:Number} for i in 1:length(d) j = piv[i] U[j,i] = iszero(d[j]) ? oneunit(Td) : d[j] / S[i] - Vt[i,j] = one(Td) + Vt[i,j] = oneunit(Td) end return SVD(U, S, Vt) end diff --git a/test/diagonal.jl b/test/diagonal.jl index c29728b5..1cd2e9df 100644 --- a/test/diagonal.jl +++ b/test/diagonal.jl @@ -463,7 +463,8 @@ Random.seed!(1) end end - @testset "svd (#11120/#11247)" begin + @testset "svd (#11120/#11247/#1149)" begin + D[1] = 0 U, s, V = svd(D) @test (U*Diagonal(s))*V' ≈ D @test svdvals(D) == s