UNPKG

2.22 kBJavaScriptView Raw
1import { factory } from '../../../utils/factory.js';
2import { clone } from '../../../utils/object.js';
3var name = 'algorithm14';
4var dependencies = ['typed'];
5export var createAlgorithm14 = /* #__PURE__ */factory(name, dependencies, _ref => {
6 var {
7 typed
8 } = _ref;
9
10 /**
11 * Iterates over DenseMatrix items and invokes the callback function f(Aij..z, b).
12 * Callback function invoked MxN times.
13 *
14 * C(i,j,...z) = f(Aij..z, b)
15 *
16 * @param {Matrix} a The DenseMatrix instance (A)
17 * @param {Scalar} b The Scalar value
18 * @param {Function} callback The f(Aij..z,b) operation to invoke
19 * @param {boolean} inverse A true value indicates callback should be invoked f(b,Aij..z)
20 *
21 * @return {Matrix} DenseMatrix (C)
22 *
23 * https://github.com/josdejong/mathjs/pull/346#issuecomment-97659042
24 */
25 return function algorithm14(a, b, callback, inverse) {
26 // a arrays
27 var adata = a._data;
28 var asize = a._size;
29 var adt = a._datatype; // datatype
30
31 var dt; // callback signature to use
32
33 var cf = callback; // process data types
34
35 if (typeof adt === 'string') {
36 // datatype
37 dt = adt; // convert b to the same datatype
38
39 b = typed.convert(b, dt); // callback
40
41 cf = typed.find(callback, [dt, dt]);
42 } // populate cdata, iterate through dimensions
43
44
45 var cdata = asize.length > 0 ? _iterate(cf, 0, asize, asize[0], adata, b, inverse) : []; // c matrix
46
47 return a.createDenseMatrix({
48 data: cdata,
49 size: clone(asize),
50 datatype: dt
51 });
52 }; // recursive function
53
54 function _iterate(f, level, s, n, av, bv, inverse) {
55 // initialize array for this level
56 var cv = []; // check we reach the last level
57
58 if (level === s.length - 1) {
59 // loop arrays in last level
60 for (var i = 0; i < n; i++) {
61 // invoke callback and store value
62 cv[i] = inverse ? f(bv, av[i]) : f(av[i], bv);
63 }
64 } else {
65 // iterate current level
66 for (var j = 0; j < n; j++) {
67 // iterate next level
68 cv[j] = _iterate(f, level + 1, s, s[level + 1], av[j], bv, inverse);
69 }
70 }
71
72 return cv;
73 }
74});
\No newline at end of file