Skip to content

Commit 5635f3a

Browse files
committed
Fix generic norm for negative p and add tests
1 parent ba8b30a commit 5635f3a

File tree

3 files changed

+25
-9
lines changed

3 files changed

+25
-9
lines changed

src/diagonal.jl

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,11 +1249,17 @@ end
12491249

12501250
# norm
12511251
function generic_normMinusInf(D::Diagonal)
1252-
norm_diag = generic_normMinusInf(D.diag)
1252+
norm_diag = norm(D.diag, -Inf)
12531253
min(norm_diag, zero(norm_diag))
12541254
end
1255-
generic_normInf(D::Diagonal) = generic_normInf(D.diag)
1256-
generic_norm1(D::Diagonal) = generic_norm1(D.diag)
1257-
_generic_norm2(D::Diagonal, maxabs) = _generic_norm2(D.diag, maxabs)
1258-
_generic_normp(D::Diagonal, p, maxabs) = _generic_normp(D.diag, p, maxabs)
1255+
generic_normInf(D::Diagonal) = norm(D.diag, Inf)
1256+
generic_norm1(D::Diagonal) = norm(D.diag, 1)
1257+
generic_norm2(D::Diagonal) = norm(D.diag, 2)
1258+
function generic_normp(D::Diagonal, p)
1259+
v = norm(D.diag, p)
1260+
if size(D,1) > 1 && p < 0
1261+
v = norm(zero(v), p)
1262+
end
1263+
return v
1264+
end
12591265
norm_x_minus_y(D1::Diagonal, D2::Diagonal) = norm_x_minus_y(D1.diag, D2.diag)

src/generic.jl

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -575,11 +575,8 @@ norm_sqr(x::Union{T,Complex{T},Rational{T}}) where {T<:Integer} = abs2(float(x))
575575
function generic_norm2(x)
576576
maxabs = normInf(x)
577577
(ismissing(maxabs) || iszero(maxabs) || isinf(maxabs)) && return maxabs
578-
return _generic_norm2(x, maxabs)
579-
end
580-
581-
function _generic_norm2(x, maxabs::T) where {T}
582578
(v, s) = iterate(x)::Tuple
579+
T = typeof(maxabs)
583580
if isfinite(length(x)*maxabs*maxabs) && !iszero(maxabs*maxabs) # Scaling not necessary
584581
sum::promote_type(Float64, T) = norm_sqr(v)
585582
for v in Iterators.rest(x, s)

test/diagonal.jl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1576,4 +1576,17 @@ end
15761576
@test D == D2
15771577
end
15781578

1579+
@testset "norm" begin
1580+
D = Diagonal(float.(1:3))
1581+
A = Array(D)
1582+
@testset for p in -2:2
1583+
p == 0 && continue
1584+
@test norm(D, p) sum(abs.(D).^p)^(1/p)
1585+
@test norm(D, p) norm(A, p)
1586+
end
1587+
@test norm(D, Inf) norm(A, Inf)
1588+
@test norm(D, -Inf) norm(A, -Inf)
1589+
@test norm(D, 0) norm(A, 0)
1590+
end
1591+
15791592
end # module TestDiagonal

0 commit comments

Comments
 (0)