|
21 | 21 | // MODULES // |
22 | 22 |
|
23 | 23 | var isnan = require('@stdlib/math/base/assert/is-nan'); |
24 | | -var abs = require('@stdlib/math/base/special/abs'); |
| 24 | +var abs = require('@stdlib/math/base/special/abs'); |
25 | 25 |
|
26 | 26 | // MAIN // |
27 | 27 |
|
28 | 28 | /** |
29 | 29 | * Computes the minimum absolute value of a strided array, ignoring `NaN` values, |
30 | 30 | * and supports accessor protocol. |
31 | | -
|
| 31 | +* |
32 | 32 | * @param {PositiveInteger} N - number of indexed elements |
33 | 33 | * @param {Object} x - input array object |
34 | 34 | * @param {Collection} x.data - input array data |
35 | 35 | * @param {Array<Function>} x.accessors - array element accessors |
36 | 36 | * @param {integer} strideX - stride length for `x` |
37 | 37 | * @param {NonNegativeInteger} offsetX - starting index for `x` |
38 | | -* @returns {Object} output array object |
| 38 | +* @returns {number} minimum absolute value |
| 39 | +* |
39 | 40 | * @example |
40 | | -
|
| 41 | +* var x = { |
| 42 | +* data: [ -2.0, NaN, -1.0, -3.0 ], |
| 43 | +* accessors: [ (arr, idx) => arr[idx] ] |
| 44 | +* }; |
| 45 | +* var v = nanminabs( 4, x, 1, 0 ); |
| 46 | +* // returns 1.0 |
41 | 47 | */ |
42 | | -function nanminabs( N, x, strideX, offsetX) { |
43 | | - var xbuf; |
44 | | - var get; |
45 | | - var min; |
46 | | - var ix; |
47 | | - var v; |
48 | | - var i; |
49 | | - |
50 | | - // Cache reference to array data: |
51 | | - xbuf = x.data; |
52 | | - |
53 | | - // Cache a reference to the element accessor: |
54 | | - get = x.accessors[ 0 ]; |
55 | | - |
56 | | - if ( N === 1 || strideX === 0 ) { |
57 | | - return get ? abs(get(xbuf, offsetX)) : abs(xbuf[offsetX]); |
| 48 | +function nanminabs(N, x, strideX, offsetX) { |
| 49 | + var xbuf; |
| 50 | + var get; |
| 51 | + var min; |
| 52 | + var ix; |
| 53 | + var v; |
| 54 | + var i; |
| 55 | + |
| 56 | + // Cache reference to array data: |
| 57 | + xbuf = x.data; |
| 58 | + |
| 59 | + // Cache a reference to the element accessor: |
| 60 | + get = x.accessors[0]; |
| 61 | + |
| 62 | + if (N === 1 || strideX === 0) { |
| 63 | + return get ? abs(get(xbuf, offsetX)) : abs(xbuf[offsetX]); |
58 | 64 | } |
59 | 65 |
|
60 | 66 | ix = offsetX; |
61 | | - for ( i = 0; i < N; i++ ) { |
62 | | - v = get ? x.get( ix ) : x[ ix ]; |
63 | | - if ( v === v ) { |
| 67 | + |
| 68 | + for (i = 0; i < N; i++) { |
| 69 | + v = get ? get(xbuf, ix) : xbuf[ix]; |
| 70 | + if (v === v) { |
64 | 71 | break; |
65 | 72 | } |
66 | 73 | ix += strideX; |
67 | 74 | } |
68 | | - if ( i === N ) { |
| 75 | + |
| 76 | + if (i === N) { |
69 | 77 | return NaN; |
70 | 78 | } |
71 | | - min = abs( v ); |
| 79 | + |
| 80 | + min = abs(v); |
72 | 81 | i += 1; |
73 | | - for ( i; i < N; i++ ) { |
| 82 | + |
| 83 | + for (; i < N; i++) { |
74 | 84 | ix += strideX; |
75 | | - v = get ? get( xbuf, ix ) : xbuf[ ix ]; |
76 | | - v = abs( v ); |
77 | | - if ( isnan( v ) ) { |
| 85 | + v = get ? get(xbuf, ix) : xbuf[ix]; |
| 86 | + v = abs(v); |
| 87 | + if (isnan(v)) { |
78 | 88 | continue; |
79 | 89 | } |
80 | | - if ( v < min ) { |
| 90 | + if (v < min) { |
81 | 91 | min = v; |
82 | 92 | } |
83 | 93 | } |
| 94 | + |
84 | 95 | return min; |
85 | 96 | } |
86 | 97 |
|
|
0 commit comments