p-norms, Vector
In mathematics, the p-norm of a vector is defined as in [1].
For p = 1, we get the taxicab norm,
array.reduce( (a,b)=>a+b ) (Although I wouldn't object to Math.sum())
for p = 2 we get the Euclidean norm,
Math.hypot(...array)
and for the limit as p → ±∞ we get the maximum/minimum norm.
Math.max(...array)
Particularly the Euclidean norm is pretty common in graphics-related
code.This could be implemented as an addition to
TypedArray.prototype.A rough sketch might look like so:
TypedArray.prototype.norm = function(p) { if (Number.isNaN(p)) { return p; } const { abs, min, max, sign } = Math; if (Number.isFinite(p)) { return this.map(x => abs(x) ** p).reduce((a, b) => a + b, 0) ** (1 / p); } return abs((sign(p) === 1 ? max : min)(...this)); };Since norms are a little too specific for
Array(as they don't
necessarily contain numerical values), it might be worth pondering about a
nativeVectorimplementation.
Will DOMPoint solve your use cases? (Personal annoyance: you can't index
DOMPoint numerically.)
Peter
Thanks for the pointers!
array.reduce( (a,b)=>a+b )(Although I wouldn't object toMath.sum())
Yes; no objections here.
Math.hypot(...array)
I'm aware of Math.hypot, but it only covers p = 2. The important thing
about Math.hypot is that it doesn't demolish numbers with high magnitudes in
the process of raising them to the power of two.
It would be great to have the same safety for other cases (i.e. p = 3) as
well. The idea was to generalize the concept for every p.
Will DOMPoint solve your use cases? (Personal annoyance: you can't index DOMPoint numerically.)
Unfortunately, DOMPoint would be a Web API, which might (and probably will)
not be available in other environments.
Essentially, what I'm suggesting is an environment-indepdendent Vector
class, though I'm reluctant to go into more detail, as I feel that hardly
anyone would want a Vector without proper operator overloading.
This really seems like a good use case for WASM + SIMD (and a small static heap), given the number-heavy nature of it.
In mathematics, the p-norm of a vector is defined as in [1].
For p = 1, we get the taxicab norm, for p = 2 we get the Euclidean norm, and for the limit as p → ±∞ we get the maximum/minimum norm.
Particularly the Euclidean norm is pretty common in graphics-related code.
This could be implemented as an addition to
TypedArray.prototype.A rough sketch might look like so:
TypedArray.prototype.norm = function(p) { if (Number.isNaN(p)) { return p; } const { abs, min, max, sign } = Math; if (Number.isFinite(p)) { return this.map(x => abs(x) ** p).reduce((a, b) => a + b, 0) ** (1 / p); } return abs((sign(p) === 1 ? max : min)(...this)); };Since norms are a little too specific for
Array(as they don't necessarily contain numerical values), it might be worth pondering about a nativeVectorimplementation.Any opinions?
[1] en.wikipedia.org/wiki/Norm_(mathematics)#p
In mathematics, the p-norm of a vector is defined as in [1]. For p = 1, we get the taxicab norm, for p = 2 we get the Euclidean norm, and for the limit as p → ±∞ we get the maximum/minimum norm. Particularly the Euclidean norm is pretty common in graphics-related code. This could be implemented as an addition to`TypedArray.prototype`. A rough sketch might look like so: ```js TypedArray.prototype.norm = function(p) { if (Number.isNaN(p)) { return p; } const { abs, min, max, sign } = Math; if (Number.isFinite(p)) { return this.map(x => abs(x) ** p).reduce((a, b) => a + b, 0) ** (1 / p); } return abs((sign(p) === 1 ? max : min)(...this)); }; ``` Since norms are a little too specific for `Array` (as they don't necessarily contain numerical values), it might be worth pondering about a native`Vector` implementation. Any opinions? [1] https://en.wikipedia.org/wiki/Norm_(mathematics)#p-norm -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 833 bytes Desc: This is a digitally signed message part. URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20170603/0a9656e4/attachment.sig>