1 | import { factory } from '../../../utils/factory.js';
|
2 | import { clone } from '../../../utils/object.js';
|
3 | var name = 'algorithm14';
|
4 | var dependencies = ['typed'];
|
5 | export 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 |