mad.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { flatten } from '../../utils/array.js';
  2. import { factory } from '../../utils/factory.js';
  3. import { improveErrorMessage } from './utils/improveErrorMessage.js';
  4. var name = 'mad';
  5. var dependencies = ['typed', 'abs', 'map', 'median', 'subtract'];
  6. export var createMad = /* #__PURE__ */factory(name, dependencies, _ref => {
  7. var {
  8. typed,
  9. abs,
  10. map,
  11. median,
  12. subtract
  13. } = _ref;
  14. /**
  15. * Compute the median absolute deviation of a matrix or a list with values.
  16. * The median absolute deviation is defined as the median of the absolute
  17. * deviations from the median.
  18. *
  19. * Syntax:
  20. *
  21. * math.mad(a, b, c, ...)
  22. * math.mad(A)
  23. *
  24. * Examples:
  25. *
  26. * math.mad(10, 20, 30) // returns 10
  27. * math.mad([1, 2, 3]) // returns 1
  28. * math.mad([[1, 2, 3], [4, 5, 6]]) // returns 1.5
  29. *
  30. * See also:
  31. *
  32. * median, mean, std, abs
  33. *
  34. * @param {Array | Matrix} array
  35. * A single matrix or multiple scalar values.
  36. * @return {*} The median absolute deviation.
  37. */
  38. return typed(name, {
  39. // mad([a, b, c, d, ...])
  40. 'Array | Matrix': _mad,
  41. // mad(a, b, c, d, ...)
  42. '...': function _(args) {
  43. return _mad(args);
  44. }
  45. });
  46. function _mad(array) {
  47. array = flatten(array.valueOf());
  48. if (array.length === 0) {
  49. throw new Error('Cannot calculate median absolute deviation (mad) of an empty array');
  50. }
  51. try {
  52. var med = median(array);
  53. return median(map(array, function (value) {
  54. return abs(subtract(value, med));
  55. }));
  56. } catch (err) {
  57. if (err instanceof TypeError && err.message.indexOf('median') !== -1) {
  58. throw new TypeError(err.message.replace('median', 'mad'));
  59. } else {
  60. throw improveErrorMessage(err, 'mad');
  61. }
  62. }
  63. }
  64. });