UNPKG

2.82 kBJavaScriptView Raw
1import { containsCollections, deepForEach, reduce } from '../../utils/collection'
2import { factory } from '../../utils/factory'
3import { improveErrorMessage } from './utils/improveErrorMessage'
4
5const name = 'min'
6const dependencies = ['typed', 'smaller']
7
8export const createMin = /* #__PURE__ */ factory(name, dependencies, ({ typed, smaller }) => {
9 /**
10 * Compute the minimum value of a matrix or a list of values.
11 * In case of a multi dimensional array, the minimum of the flattened array
12 * will be calculated. When `dim` is provided, the minimum over the selected
13 * dimension will be calculated. Parameter `dim` is zero-based.
14 *
15 * Syntax:
16 *
17 * math.min(a, b, c, ...)
18 * math.min(A)
19 * math.min(A, dim)
20 *
21 * Examples:
22 *
23 * math.min(2, 1, 4, 3) // returns 1
24 * math.min([2, 1, 4, 3]) // returns 1
25 *
26 * // minimum over a specified dimension (zero-based)
27 * math.min([[2, 5], [4, 3], [1, 7]], 0) // returns [1, 3]
28 * math.min([[2, 5], [4, 3], [1, 7]], 1) // returns [2, 3, 1]
29 *
30 * math.max(2.7, 7.1, -4.5, 2.0, 4.1) // returns 7.1
31 * math.min(2.7, 7.1, -4.5, 2.0, 4.1) // returns -4.5
32 *
33 * See also:
34 *
35 * mean, median, max, prod, std, sum, variance
36 *
37 * @param {... *} args A single matrix or or multiple scalar values
38 * @return {*} The minimum value
39 */
40 return typed(name, {
41 // min([a, b, c, d, ...])
42 'Array | Matrix': _min,
43
44 // min([a, b, c, d, ...], dim)
45 'Array | Matrix, number | BigNumber': function (array, dim) {
46 return reduce(array, dim.valueOf(), _smallest)
47 },
48
49 // min(a, b, c, d, ...)
50 '...': function (args) {
51 if (containsCollections(args)) {
52 throw new TypeError('Scalar values expected in function min')
53 }
54
55 return _min(args)
56 }
57 })
58
59 /**
60 * Return the smallest of two values
61 * @param {*} x
62 * @param {*} y
63 * @returns {*} Returns x when x is smallest, or y when y is smallest
64 * @private
65 */
66 function _smallest (x, y) {
67 try {
68 return smaller(x, y) ? x : y
69 } catch (err) {
70 throw improveErrorMessage(err, 'min', y)
71 }
72 }
73
74 /**
75 * Recursively calculate the minimum value in an n-dimensional array
76 * @param {Array} array
77 * @return {number} min
78 * @private
79 */
80 function _min (array) {
81 let min
82
83 deepForEach(array, function (value) {
84 try {
85 if (isNaN(value) && typeof value === 'number') {
86 min = NaN
87 } else if (min === undefined || smaller(value, min)) {
88 min = value
89 }
90 } catch (err) {
91 throw improveErrorMessage(err, 'min', value)
92 }
93 })
94
95 if (min === undefined) {
96 throw new Error('Cannot calculate min of an empty array')
97 }
98
99 return min
100 }
101})