simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

matrixFromFunction.js (2791B)


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