mean.js (2768B)
1 import { containsCollections, deepForEach, reduce } from '../../utils/collection.js'; 2 import { arraySize } from '../../utils/array.js'; 3 import { factory } from '../../utils/factory.js'; 4 import { improveErrorMessage } from './utils/improveErrorMessage.js'; 5 var name = 'mean'; 6 var dependencies = ['typed', 'add', 'divide']; 7 export var createMean = /* #__PURE__ */factory(name, dependencies, _ref => { 8 var { 9 typed, 10 add, 11 divide 12 } = _ref; 13 14 /** 15 * Compute the mean value of matrix or a list with values. 16 * In case of a multi dimensional array, the mean of the flattened array 17 * will be calculated. When `dim` is provided, the maximum over the selected 18 * dimension will be calculated. Parameter `dim` is zero-based. 19 * 20 * Syntax: 21 * 22 * math.mean(a, b, c, ...) 23 * math.mean(A) 24 * math.mean(A, dim) 25 * 26 * Examples: 27 * 28 * math.mean(2, 1, 4, 3) // returns 2.5 29 * math.mean([1, 2.7, 3.2, 4]) // returns 2.725 30 * 31 * math.mean([[2, 5], [6, 3], [1, 7]], 0) // returns [3, 5] 32 * math.mean([[2, 5], [6, 3], [1, 7]], 1) // returns [3.5, 4.5, 4] 33 * 34 * See also: 35 * 36 * median, min, max, sum, prod, std, variance 37 * 38 * @param {... *} args A single matrix or or multiple scalar values 39 * @return {*} The mean of all values 40 */ 41 return typed(name, { 42 // mean([a, b, c, d, ...]) 43 'Array | Matrix': _mean, 44 // mean([a, b, c, d, ...], dim) 45 'Array | Matrix, number | BigNumber': _nmeanDim, 46 // mean(a, b, c, d, ...) 47 '...': function _(args) { 48 if (containsCollections(args)) { 49 throw new TypeError('Scalar values expected in function mean'); 50 } 51 52 return _mean(args); 53 } 54 }); 55 /** 56 * Calculate the mean value in an n-dimensional array, returning a 57 * n-1 dimensional array 58 * @param {Array} array 59 * @param {number} dim 60 * @return {number} mean 61 * @private 62 */ 63 64 function _nmeanDim(array, dim) { 65 try { 66 var sum = reduce(array, dim, add); 67 var s = Array.isArray(array) ? arraySize(array) : array.size(); 68 return divide(sum, s[dim]); 69 } catch (err) { 70 throw improveErrorMessage(err, 'mean'); 71 } 72 } 73 /** 74 * Recursively calculate the mean value in an n-dimensional array 75 * @param {Array} array 76 * @return {number} mean 77 * @private 78 */ 79 80 81 function _mean(array) { 82 var sum; 83 var num = 0; 84 deepForEach(array, function (value) { 85 try { 86 sum = sum === undefined ? value : add(sum, value); 87 num++; 88 } catch (err) { 89 throw improveErrorMessage(err, 'mean', value); 90 } 91 }); 92 93 if (num === 0) { 94 throw new Error('Cannot calculate the mean of an empty array'); 95 } 96 97 return divide(sum, num); 98 } 99 });