diff --git a/src/dense.jl b/src/dense.jl index e68f7e94..24355fcd 100644 --- a/src/dense.jl +++ b/src/dense.jl @@ -1779,6 +1779,10 @@ Condition number of the matrix `M`, computed using the operator `p`-norm. Valid """ function cond(A::AbstractMatrix, p::Real=2) if p == 2 + if isempty(A) + checksquare(A) + return zero(real(eigtype(eltype(A)))) + end v = svdvals(A) maxv = maximum(v) return iszero(maxv) ? oftype(real(maxv), Inf) : maxv / minimum(v) diff --git a/test/dense.jl b/test/dense.jl index 236587df..c53dabb8 100644 --- a/test/dense.jl +++ b/test/dense.jl @@ -56,6 +56,18 @@ Random.seed!(1234323) @test cond(Mars, 2) ≈ 6.181867355918493 @test cond(Mars, Inf) ≈ 7.1 end + @testset "Empty matrices" begin + for p in (1,2,Inf) + # zero for square (i.e. 0×0) matrices + @test cond(zeros(Int, 0, 0), p) === 0.0 + @test cond(zeros(0, 0), p) === 0.0 + @test cond(zeros(ComplexF64, 0, 0), p) === 0.0 + # error for non-square matrices + for size in ((10,0), (0,10)) + @test_throws DimensionMismatch cond(zeros(size...), p) + end + end + end end areal = randn(n,n)/2