Skip to content

Commit 677f330

Browse files
authored
Merge pull request #120 from JuliaLinearAlgebra/an/zerosvd
Test svd of zero matrix and fix the sign flipping when there are
2 parents a90f9f2 + 85e8031 commit 677f330

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

src/svd.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,12 +253,16 @@ function _svdvals!(B::Bidiagonal{T}; tol = eps(T)) where {T<:Real}
253253
return sort(abs.(diag(B)), rev = true)
254254
end
255255

256+
# We want to avoid that zero eigenvalues zero out any singular vectors so we'd
257+
# have to use a modified sign function
258+
_sign(x) = ifelse(iszero(x), one(x), sign(x))
259+
256260
function _sort_and_adjust!(U, s, Vᴴ)
257261
n = length(s)
258262

259263
# Adjust sign of singular values if necessary
260264
if any(!isposdef, s)
261-
rmul!(U, Diagonal(sign.(s)))
265+
rmul!(U, Diagonal(_sign.(s)))
262266
map!(abs, s, s)
263267
end
264268

test/svd.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,4 +241,11 @@ using Test, GenericLinearAlgebra, LinearAlgebra, Quaternions, DoubleFloats
241241
BF = GenericLinearAlgebra.bidiagonalize!(copy(A))
242242
@test (BF.rightQ' * Matrix(I, size(A)...)) * BF.rightQ I
243243
end
244+
245+
@testset "Issue 119" begin
246+
F = svd(zeros(BigFloat, 2, 2))
247+
@test F.S == zeros(2)
248+
@test F.U == I
249+
@test F.Vt == I
250+
end
244251
end

0 commit comments

Comments
 (0)