mean.js 2.7 KB

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