blas-dnrm2
Version:
Computes the L2 norm (Euclidean norm).
66 lines (57 loc) • 1.17 kB
JavaScript
;
// MODULE //
var abs = require( 'math-abs' );
var sqrt = require( 'math-sqrt' );
// DNRM2 //
/**
* FUNCTION: dnrm2( N, x, stride, offset )
* Computes the L2 norm.
*
* @param {Number} N - number of accessed elements
* @param {Array|Int8Array|Uint8Array|Uint8ClampedArray|Int16Array|Uint16Array|Int32Array|Uint32Array|Float32Array|Float64Array} x - input array
* @param {Number} stride - specifies how to index into `x`
* @param {Number} offset - specifies where to begin indexing into `x`
* @returns {Number|Void} norm or undefined
*/
function dnrm2( N, x, stride, offset ) {
var val;
var ix;
var i;
var r;
var s;
var t;
if (
N < 0 ||
stride <= 0 ||
offset < 0
) {
return;
}
if ( N === 0 ) {
return 0;
}
ix = offset;
if ( N === 1 ) {
return abs( x[ ix ] );
}
t = 0; // scale
s = 1; // sum of squares
for ( i = 0; i < N; i++ ) {
val = x[ ix ];
if ( val !== 0 ) {
val = abs( val );
if ( val > t ) {
r = t / val;
s = 1 + s*r*r;
t = val;
} else {
r = val / t;
s = s + r*r;
}
}
ix += stride;
}
return t * sqrt( s );
} // end FUNCTION dnrm2()
// EXPORTS //
module.exports = dnrm2;