mean.js 3.0 KB

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