Skip to content

Commit e634972

Browse files
committed
recursive vecnorm
1 parent df2616e commit e634972

File tree

1 file changed

+29
-24
lines changed

1 file changed

+29
-24
lines changed

base/linalg/generic.jl

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -280,10 +280,10 @@ diag(A::AbstractVector) = throw(ArgumentError("use diagm instead of diag to cons
280280
function generic_vecnormMinusInf(x)
281281
s = start(x)
282282
(v, s) = next(x, s)
283-
minabs = norm(v)
283+
minabs = vecnormMinusInf(v)
284284
while !done(x, s)
285285
(v, s) = next(x, s)
286-
vnorm = norm(v)
286+
vnorm = vecnormMinusInf(v)
287287
minabs = ifelse(isnan(minabs) | (minabs < vnorm), minabs, vnorm)
288288
end
289289
return float(minabs)
@@ -292,10 +292,10 @@ end
292292
function generic_vecnormInf(x)
293293
s = start(x)
294294
(v, s) = next(x, s)
295-
maxabs = norm(v)
295+
maxabs = vecnormInf(v)
296296
while !done(x, s)
297297
(v, s) = next(x, s)
298-
vnorm = norm(v)
298+
vnorm = vecnormInf(v)
299299
maxabs = ifelse(isnan(maxabs) | (maxabs > vnorm), maxabs, vnorm)
300300
end
301301
return float(maxabs)
@@ -304,20 +304,20 @@ end
304304
function generic_vecnorm1(x)
305305
s = start(x)
306306
(v, s) = next(x, s)
307-
av = float(norm(v))
307+
av = float(vecnorm1(v))
308308
T = typeof(av)
309309
sum::promote_type(Float64, T) = av
310310
while !done(x, s)
311311
(v, s) = next(x, s)
312-
sum += norm(v)
312+
sum += vecnorm1(v)
313313
end
314314
return convert(T, sum)
315315
end
316316

317317
# faster computation of norm(x)^2, avoiding overflow for integers
318-
norm_sqr(x) = norm(x)^2
319-
norm_sqr(x::Number) = abs2(x)
320-
norm_sqr(x::Union{T,Complex{T},Rational{T}}) where {T<:Integer} = abs2(float(x))
318+
vecnorm_sqr(x) = vecnorm(x)^2
319+
vecnorm_sqr(x::Number) = abs2(x)
320+
vecnorm_sqr(x::Union{T,Complex{T},Rational{T}}) where {T<:Integer} = abs2(float(x))
321321

322322
function generic_vecnorm2(x)
323323
maxabs = vecnormInf(x)
@@ -326,17 +326,17 @@ function generic_vecnorm2(x)
326326
(v, s) = next(x, s)
327327
T = typeof(maxabs)
328328
if isfinite(_length(x)*maxabs*maxabs) && maxabs*maxabs != 0 # Scaling not necessary
329-
sum::promote_type(Float64, T) = norm_sqr(v)
329+
sum::promote_type(Float64, T) = vecnorm_sqr(v)
330330
while !done(x, s)
331331
(v, s) = next(x, s)
332-
sum += norm_sqr(v)
332+
sum += vecnorm_sqr(v)
333333
end
334334
return convert(T, sqrt(sum))
335335
else
336-
sum = abs2(norm(v)/maxabs)
336+
sum = abs2(vecnorm(v)/maxabs)
337337
while !done(x, s)
338338
(v, s) = next(x, s)
339-
sum += (norm(v)/maxabs)^2
339+
sum += (vecnorm(v)/maxabs)^2
340340
end
341341
return convert(T, maxabs*sqrt(sum))
342342
end
@@ -352,21 +352,21 @@ function generic_vecnormp(x, p)
352352
(maxabs == 0 || isinf(maxabs)) && return maxabs
353353
T = typeof(maxabs)
354354
else
355-
T = typeof(float(norm(v)))
355+
T = typeof(float(vecnorm(v)))
356356
end
357357
spp::promote_type(Float64, T) = p
358358
if -1 <= p <= 1 || (isfinite(_length(x)*maxabs^spp) && maxabs^spp != 0) # scaling not necessary
359-
sum::promote_type(Float64, T) = norm(v)^spp
359+
sum::promote_type(Float64, T) = vecnormp(v, p)^spp
360360
while !done(x, s)
361361
(v, s) = next(x, s)
362-
sum += norm(v)^spp
362+
sum += vecnormp(v, p)^spp
363363
end
364364
return convert(T, sum^inv(spp))
365365
else # rescaling
366-
sum = (norm(v)/maxabs)^spp
366+
sum = (vecnormp(v, p)/maxabs)^spp
367367
while !done(x, s)
368368
(v, s) = next(x, s)
369-
sum += (norm(v)/maxabs)^spp
369+
sum += (vecnorm(v, p)/maxabs)^spp
370370
end
371371
return convert(T, maxabs*sum^inv(spp))
372372
end
@@ -449,6 +449,11 @@ julia> vecnorm(-2, Inf)
449449
```
450450
"""
451451
@inline vecnorm(x::Number, p::Real=2) = p == 0 ? (x==0 ? zero(abs(x)) : oneunit(abs(x))) : abs(x)
452+
@inline vecnormMinusInf(x::Number) = abs(x)
453+
@inline vecnormInf(x::Number) = abs(x)
454+
@inline vecnorm1(x::Number) = abs(x)
455+
@inline vecnorm2(x::Number) = abs(x)
456+
@inline vecnormp(x::Number, p) = p == 0 ? (x==0 ? zero(abs(x)) : oneunit(abs(x))) : abs(x)
452457

453458
function norm1(A::AbstractMatrix{T}) where T
454459
m, n = size(A)
@@ -621,11 +626,11 @@ function vecdot(x::AbstractArray, y::AbstractArray)
621626
throw(DimensionMismatch("first array has length $(lx) which does not match the length of the second, $(_length(y))."))
622627
end
623628
if lx == 0
624-
return dot(zero(eltype(x)), zero(eltype(y)))
629+
return vecdot(zero(eltype(x)), zero(eltype(y)))
625630
end
626-
s = zero(dot(first(x), first(y)))
631+
s = zero(vecdot(first(x), first(y)))
627632
for (Ix, Iy) in zip(eachindex(x), eachindex(y))
628-
@inbounds s += dot(x[Ix], y[Iy])
633+
@inbounds s += vecdot(x[Ix], y[Iy])
629634
end
630635
s
631636
end
@@ -656,22 +661,22 @@ function vecdot(x, y) # arbitrary iterables
656661
if !isempty(y)
657662
throw(DimensionMismatch("x and y are of different lengths!"))
658663
end
659-
return dot(zero(eltype(x)), zero(eltype(y)))
664+
return vecdot(zero(eltype(x)), zero(eltype(y)))
660665
end
661666
iy = start(y)
662667
if done(y, iy)
663668
throw(DimensionMismatch("x and y are of different lengths!"))
664669
end
665670
(vx, ix) = next(x, ix)
666671
(vy, iy) = next(y, iy)
667-
s = dot(vx, vy)
672+
s = vecdot(vx, vy)
668673
while !done(x, ix)
669674
if done(y, iy)
670675
throw(DimensionMismatch("x and y are of different lengths!"))
671676
end
672677
(vx, ix) = next(x, ix)
673678
(vy, iy) = next(y, iy)
674-
s += dot(vx, vy)
679+
s += vecdot(vx, vy)
675680
end
676681
if !done(y, iy)
677682
throw(DimensionMismatch("x and y are of different lengths!"))

0 commit comments

Comments
 (0)