matrixFromFunction.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { factory } from '../../utils/factory.js';
  2. var name = 'matrixFromFunction';
  3. var dependencies = ['typed', 'matrix', 'isZero'];
  4. export var createMatrixFromFunction = /* #__PURE__ */factory(name, dependencies, _ref => {
  5. var {
  6. typed,
  7. matrix,
  8. isZero
  9. } = _ref;
  10. /**
  11. * Create a matrix by evaluating a generating function at each index.
  12. * The simplest overload returns a multi-dimensional array as long as `size` is an array.
  13. * Passing `size` as a Matrix or specifying a `format` will result in returning a Matrix.
  14. *
  15. * Syntax:
  16. *
  17. * math.matrixFromFunction(size, fn)
  18. * math.matrixFromFunction(size, fn, format)
  19. * math.matrixFromFunction(size, fn, format, datatype)
  20. * math.matrixFromFunction(size, format, fn)
  21. * math.matrixFromFunction(size, format, datatype, fn)
  22. *
  23. * Examples:
  24. *
  25. * math.matrixFromFunction([3,3], i => i[0] - i[1]) // an antisymmetric matrix
  26. * math.matrixFromFunction([100, 100], 'sparse', i => i[0] - i[1] === 1 ? 4 : 0) // a sparse subdiagonal matrix
  27. * math.matrixFromFunction([5], i => math.random()) // a random vector
  28. *
  29. * See also:
  30. *
  31. * matrix, zeros
  32. *
  33. * @param {Array | Matrix} size The size of the matrix to be created
  34. * @param {function} fn Callback function invoked for every entry in the matrix
  35. * @param {string} [format] The Matrix storage format, either `'dense'` or `'sparse'`
  36. * @param {string} [datatype] Type of the values
  37. * @return {Array | Matrix} Returns the created matrix
  38. */
  39. return typed(name, {
  40. 'Array | Matrix, function, string, string': function ArrayMatrixFunctionStringString(size, fn, format, datatype) {
  41. return _create(size, fn, format, datatype);
  42. },
  43. 'Array | Matrix, function, string': function ArrayMatrixFunctionString(size, fn, format) {
  44. return _create(size, fn, format);
  45. },
  46. 'Matrix, function': function MatrixFunction(size, fn) {
  47. return _create(size, fn, 'dense');
  48. },
  49. 'Array, function': function ArrayFunction(size, fn) {
  50. return _create(size, fn, 'dense').toArray();
  51. },
  52. 'Array | Matrix, string, function': function ArrayMatrixStringFunction(size, format, fn) {
  53. return _create(size, fn, format);
  54. },
  55. 'Array | Matrix, string, string, function': function ArrayMatrixStringStringFunction(size, format, datatype, fn) {
  56. return _create(size, fn, format, datatype);
  57. }
  58. });
  59. function _create(size, fn, format, datatype) {
  60. var m;
  61. if (datatype !== undefined) {
  62. m = matrix(format, datatype);
  63. } else {
  64. m = matrix(format);
  65. }
  66. m.resize(size);
  67. m.forEach(function (_, index) {
  68. var val = fn(index);
  69. if (isZero(val)) return;
  70. m.set(index, val);
  71. });
  72. return m;
  73. }
  74. });