mathjs 10.4.2 → 10.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HISTORY.md +36 -0
- package/docs/datatypes/matrices.md +17 -0
- package/docs/expressions/syntax.md +11 -4
- package/docs/reference/functions/fix.md +1 -0
- package/docs/reference/functions/floor.md +4 -0
- package/docs/reference/functions/lgamma.md +46 -0
- package/docs/reference/functions/pinv.md +44 -0
- package/docs/reference/functions/pow.md +8 -2
- package/docs/reference/functions/resolve.md +2 -2
- package/docs/reference/functions/simplifyConstant.md +52 -0
- package/docs/reference/functions/stirlingS2.md +5 -1
- package/docs/reference/functions.md +2 -0
- package/lib/browser/math.js +6 -6
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/entry/dependenciesAny/dependenciesCeil.generated.js +6 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesDet.generated.js +5 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesFix.generated.js +9 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesFloor.generated.js +6 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesIndexNode.generated.js +0 -3
- package/lib/cjs/entry/dependenciesAny/dependenciesLgamma.generated.js +23 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesPinv.generated.js +53 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesPow.generated.js +3 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesStirlingS2.generated.js +6 -0
- package/lib/cjs/entry/dependenciesAny.generated.js +16 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesCeil.generated.js +3 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesFix.generated.js +6 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesFloor.generated.js +3 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesIndexNode.generated.js +0 -3
- package/lib/cjs/entry/dependenciesNumber/dependenciesLgamma.generated.js +20 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesStirlingS2.generated.js +3 -0
- package/lib/cjs/entry/dependenciesNumber.generated.js +8 -0
- package/lib/cjs/entry/impureFunctionsAny.generated.js +96 -95
- package/lib/cjs/entry/impureFunctionsNumber.generated.js +11 -11
- package/lib/cjs/entry/pureFunctionsAny.generated.js +227 -196
- package/lib/cjs/entry/pureFunctionsNumber.generated.js +36 -25
- package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +6 -0
- package/lib/cjs/expression/embeddedDocs/function/arithmetic/pow.js +1 -1
- package/lib/cjs/expression/embeddedDocs/function/matrix/pinv.js +15 -0
- package/lib/cjs/expression/embeddedDocs/function/probability/lgamma.js +15 -0
- package/lib/cjs/expression/node/IndexNode.js +26 -61
- package/lib/cjs/factoriesAny.js +16 -0
- package/lib/cjs/factoriesNumber.js +44 -27
- package/lib/cjs/function/algebra/resolve.js +3 -3
- package/lib/cjs/function/arithmetic/ceil.js +75 -39
- package/lib/cjs/function/arithmetic/fix.js +54 -16
- package/lib/cjs/function/arithmetic/floor.js +79 -37
- package/lib/cjs/function/arithmetic/nthRoot.js +1 -3
- package/lib/cjs/function/arithmetic/pow.js +25 -6
- package/lib/cjs/function/arithmetic/round.js +27 -47
- package/lib/cjs/function/combinatorics/stirlingS2.js +42 -12
- package/lib/cjs/function/matrix/det.js +37 -31
- package/lib/cjs/function/matrix/pinv.js +223 -0
- package/lib/cjs/function/probability/lgamma.js +146 -0
- package/lib/cjs/header.js +2 -2
- package/lib/cjs/plain/number/arithmetic.js +17 -31
- package/lib/cjs/plain/number/probability.js +43 -3
- package/lib/cjs/type/matrix/function/sparse.js +6 -0
- package/lib/cjs/utils/latex.js +6 -0
- package/lib/cjs/utils/lruQueue.js +1 -3
- package/lib/cjs/utils/number.js +17 -2
- package/lib/cjs/utils/object.js +3 -1
- package/lib/cjs/version.js +1 -1
- package/lib/esm/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
- package/lib/esm/entry/dependenciesAny/dependenciesDet.generated.js +4 -2
- package/lib/esm/entry/dependenciesAny/dependenciesFix.generated.js +6 -0
- package/lib/esm/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
- package/lib/esm/entry/dependenciesAny/dependenciesIndexNode.generated.js +0 -2
- package/lib/esm/entry/dependenciesAny/dependenciesLgamma.generated.js +12 -0
- package/lib/esm/entry/dependenciesAny/dependenciesPinv.generated.js +32 -0
- package/lib/esm/entry/dependenciesAny/dependenciesPow.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesStirlingS2.generated.js +4 -0
- package/lib/esm/entry/dependenciesAny.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesCeil.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesFix.generated.js +4 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesFloor.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesIndexNode.generated.js +0 -2
- package/lib/esm/entry/dependenciesNumber/dependenciesLgamma.generated.js +10 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesStirlingS2.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber.generated.js +1 -0
- package/lib/esm/entry/impureFunctionsAny.generated.js +90 -89
- package/lib/esm/entry/impureFunctionsNumber.generated.js +12 -12
- package/lib/esm/entry/pureFunctionsAny.generated.js +191 -162
- package/lib/esm/entry/pureFunctionsNumber.generated.js +24 -14
- package/lib/esm/expression/embeddedDocs/embeddedDocs.js +4 -0
- package/lib/esm/expression/embeddedDocs/function/arithmetic/pow.js +1 -1
- package/lib/esm/expression/embeddedDocs/function/matrix/pinv.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/probability/lgamma.js +8 -0
- package/lib/esm/expression/node/BlockNode.js +3 -3
- package/lib/esm/expression/node/IndexNode.js +22 -59
- package/lib/esm/expression/parse.js +5 -5
- package/lib/esm/factoriesAny.js +2 -0
- package/lib/esm/factoriesNumber.js +21 -8
- package/lib/esm/function/algebra/decomposition/qr.js +2 -2
- package/lib/esm/function/algebra/resolve.js +3 -3
- package/lib/esm/function/algebra/solver/utils/solveValidation.js +5 -5
- package/lib/esm/function/algebra/sparse/csChol.js +2 -2
- package/lib/esm/function/algebra/sparse/csLeaf.js +2 -2
- package/lib/esm/function/algebra/sparse/csLu.js +3 -3
- package/lib/esm/function/arithmetic/ceil.js +61 -24
- package/lib/esm/function/arithmetic/fix.js +51 -13
- package/lib/esm/function/arithmetic/floor.js +65 -23
- package/lib/esm/function/arithmetic/nthRoot.js +1 -3
- package/lib/esm/function/arithmetic/nthRoots.js +1 -1
- package/lib/esm/function/arithmetic/pow.js +25 -6
- package/lib/esm/function/arithmetic/round.js +25 -43
- package/lib/esm/function/combinatorics/stirlingS2.js +41 -12
- package/lib/esm/function/matrix/det.js +35 -31
- package/lib/esm/function/matrix/expm.js +2 -2
- package/lib/esm/function/matrix/pinv.js +205 -0
- package/lib/esm/function/probability/gamma.js +1 -1
- package/lib/esm/function/probability/lgamma.js +137 -0
- package/lib/esm/function/string/bin.js +1 -1
- package/lib/esm/function/string/hex.js +1 -1
- package/lib/esm/function/string/oct.js +1 -1
- package/lib/esm/plain/number/arithmetic.js +16 -20
- package/lib/esm/plain/number/probability.js +33 -1
- package/lib/esm/type/complex/Complex.js +2 -2
- package/lib/esm/type/matrix/DenseMatrix.js +2 -2
- package/lib/esm/type/matrix/FibonacciHeap.js +2 -2
- package/lib/esm/type/matrix/SparseMatrix.js +13 -13
- package/lib/esm/type/matrix/function/sparse.js +6 -0
- package/lib/esm/type/unit/Unit.js +7 -7
- package/lib/esm/utils/latex.js +6 -0
- package/lib/esm/utils/lruQueue.js +1 -2
- package/lib/esm/utils/number.js +16 -4
- package/lib/esm/utils/object.js +3 -1
- package/lib/esm/version.js +1 -1
- package/package.json +20 -9
- package/types/index.d.ts +1806 -1363
- package/types/index.ts +705 -264
|
@@ -1,20 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
8
|
-
exports.
|
|
9
|
-
|
|
10
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
6
|
+
exports.createRound = void 0;
|
|
11
7
|
|
|
12
8
|
var _factory = require("../../utils/factory.js");
|
|
13
9
|
|
|
14
10
|
var _collection = require("../../utils/collection.js");
|
|
15
11
|
|
|
16
|
-
var _number = require("../../utils/number.js");
|
|
17
|
-
|
|
18
12
|
var _algorithm = require("../../type/matrix/utils/algorithm11.js");
|
|
19
13
|
|
|
20
14
|
var _algorithm2 = require("../../type/matrix/utils/algorithm12.js");
|
|
@@ -23,10 +17,6 @@ var _algorithm3 = require("../../type/matrix/utils/algorithm14.js");
|
|
|
23
17
|
|
|
24
18
|
var _index = require("../../plain/number/index.js");
|
|
25
19
|
|
|
26
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
27
|
-
|
|
28
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
29
|
-
|
|
30
20
|
var NO_INT = 'Number of decimals in function round must be an integer';
|
|
31
21
|
var name = 'round';
|
|
32
22
|
var dependencies = ['typed', 'matrix', 'equalScalar', 'zeros', 'BigNumber', 'DenseMatrix'];
|
|
@@ -84,7 +74,16 @@ var createRound = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
|
|
|
84
74
|
* @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value
|
|
85
75
|
*/
|
|
86
76
|
|
|
87
|
-
return typed(name,
|
|
77
|
+
return typed(name, {
|
|
78
|
+
number: _index.roundNumber,
|
|
79
|
+
'number, number': _index.roundNumber,
|
|
80
|
+
'number, BigNumber': function numberBigNumber(x, n) {
|
|
81
|
+
if (!n.isInteger()) {
|
|
82
|
+
throw new TypeError(NO_INT);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return new BigNumber(x).toDecimalPlaces(n.toNumber());
|
|
86
|
+
},
|
|
88
87
|
Complex: function Complex(x) {
|
|
89
88
|
return x.round();
|
|
90
89
|
},
|
|
@@ -104,13 +103,6 @@ var createRound = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
|
|
|
104
103
|
|
|
105
104
|
return x.round(_n);
|
|
106
105
|
},
|
|
107
|
-
'number, BigNumber': function numberBigNumber(x, n) {
|
|
108
|
-
if (!n.isInteger()) {
|
|
109
|
-
throw new TypeError(NO_INT);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
return new BigNumber(x).toDecimalPlaces(n.toNumber());
|
|
113
|
-
},
|
|
114
106
|
BigNumber: function BigNumber(x) {
|
|
115
107
|
return x.toDecimalPlaces(0);
|
|
116
108
|
},
|
|
@@ -131,6 +123,13 @@ var createRound = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
|
|
|
131
123
|
|
|
132
124
|
return x.round(n);
|
|
133
125
|
},
|
|
126
|
+
'Fraction, BigNumber': function FractionBigNumber(x, n) {
|
|
127
|
+
if (!n.isInteger()) {
|
|
128
|
+
throw new TypeError(NO_INT);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return x.round(n.toNumber());
|
|
132
|
+
},
|
|
134
133
|
'Array | Matrix': function ArrayMatrix(x) {
|
|
135
134
|
// deep map collection, skip zeros since round(0) = 0
|
|
136
135
|
return (0, _collection.deepMap)(x, this, true);
|
|
@@ -141,7 +140,11 @@ var createRound = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
|
|
|
141
140
|
'DenseMatrix, number | BigNumber': function DenseMatrixNumberBigNumber(x, y) {
|
|
142
141
|
return algorithm14(x, y, this, false);
|
|
143
142
|
},
|
|
144
|
-
'number |
|
|
143
|
+
'Array, number | BigNumber': function ArrayNumberBigNumber(x, y) {
|
|
144
|
+
// use matrix implementation
|
|
145
|
+
return algorithm14(matrix(x), y, this, false).valueOf();
|
|
146
|
+
},
|
|
147
|
+
'number | Complex | BigNumber | Fraction, SparseMatrix': function numberComplexBigNumberFractionSparseMatrix(x, y) {
|
|
145
148
|
// check scalar is zero
|
|
146
149
|
if (equalScalar(x, 0)) {
|
|
147
150
|
// do not execute algorithm, result will be a zero matrix
|
|
@@ -150,7 +153,7 @@ var createRound = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
|
|
|
150
153
|
|
|
151
154
|
return algorithm12(y, x, this, true);
|
|
152
155
|
},
|
|
153
|
-
'number | Complex | BigNumber, DenseMatrix': function
|
|
156
|
+
'number | Complex | BigNumber | Fraction, DenseMatrix': function numberComplexBigNumberFractionDenseMatrix(x, y) {
|
|
154
157
|
// check scalar is zero
|
|
155
158
|
if (equalScalar(x, 0)) {
|
|
156
159
|
// do not execute algorithm, result will be a zero matrix
|
|
@@ -159,33 +162,10 @@ var createRound = /* #__PURE__ */(0, _factory.factory)(name, dependencies, funct
|
|
|
159
162
|
|
|
160
163
|
return algorithm14(y, x, this, true);
|
|
161
164
|
},
|
|
162
|
-
'
|
|
163
|
-
// use matrix implementation
|
|
164
|
-
return algorithm14(matrix(x), y, this, false).valueOf();
|
|
165
|
-
},
|
|
166
|
-
'number | Complex | BigNumber, Array': function numberComplexBigNumberArray(x, y) {
|
|
165
|
+
'number | Complex | BigNumber | Fraction, Array': function numberComplexBigNumberFractionArray(x, y) {
|
|
167
166
|
// use matrix implementation
|
|
168
167
|
return algorithm14(matrix(y), x, this, true).valueOf();
|
|
169
168
|
}
|
|
170
|
-
})
|
|
171
|
-
});
|
|
172
|
-
exports.createRound = createRound;
|
|
173
|
-
var roundNumberSignatures = {
|
|
174
|
-
number: _index.roundNumber,
|
|
175
|
-
'number, number': function numberNumber(x, n) {
|
|
176
|
-
if (!(0, _number.isInteger)(n)) {
|
|
177
|
-
throw new TypeError(NO_INT);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
if (n < 0 || n > 15) {
|
|
181
|
-
throw new Error('Number of decimals in function round must be in the range of 0-15');
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
return (0, _index.roundNumber)(x, n);
|
|
185
|
-
}
|
|
186
|
-
};
|
|
187
|
-
var createRoundNumber = /* #__PURE__ */(0, _factory.factory)(name, ['typed'], function (_ref2) {
|
|
188
|
-
var typed = _ref2.typed;
|
|
189
|
-
return typed(name, roundNumberSignatures);
|
|
169
|
+
});
|
|
190
170
|
});
|
|
191
|
-
exports.
|
|
171
|
+
exports.createRound = createRound;
|
|
@@ -7,8 +7,10 @@ exports.createStirlingS2 = void 0;
|
|
|
7
7
|
|
|
8
8
|
var _factory = require("../../utils/factory.js");
|
|
9
9
|
|
|
10
|
+
var _is = require("../../utils/is.js");
|
|
11
|
+
|
|
10
12
|
var name = 'stirlingS2';
|
|
11
|
-
var dependencies = ['typed', 'addScalar', 'subtract', 'multiplyScalar', 'divideScalar', 'pow', 'factorial', 'combinations', 'isNegative', 'isInteger', 'larger'];
|
|
13
|
+
var dependencies = ['typed', 'addScalar', 'subtract', 'multiplyScalar', 'divideScalar', 'pow', 'factorial', 'combinations', 'isNegative', 'isInteger', 'number', '?bignumber', 'larger'];
|
|
12
14
|
var createStirlingS2 = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
|
|
13
15
|
var typed = _ref.typed,
|
|
14
16
|
addScalar = _ref.addScalar,
|
|
@@ -20,15 +22,22 @@ var createStirlingS2 = /* #__PURE__ */(0, _factory.factory)(name, dependencies,
|
|
|
20
22
|
combinations = _ref.combinations,
|
|
21
23
|
isNegative = _ref.isNegative,
|
|
22
24
|
isInteger = _ref.isInteger,
|
|
25
|
+
number = _ref.number,
|
|
26
|
+
bignumber = _ref.bignumber,
|
|
23
27
|
larger = _ref.larger;
|
|
24
|
-
|
|
28
|
+
var smallCache = [];
|
|
29
|
+
var bigCache = [];
|
|
25
30
|
/**
|
|
26
31
|
* The Stirling numbers of the second kind, counts the number of ways to partition
|
|
27
32
|
* a set of n labelled objects into k nonempty unlabelled subsets.
|
|
28
33
|
* stirlingS2 only takes integer arguments.
|
|
29
34
|
* The following condition must be enforced: k <= n.
|
|
30
35
|
*
|
|
31
|
-
* If n = k or k = 1, then s(n,k) = 1
|
|
36
|
+
* If n = k or k = 1 <= n, then s(n,k) = 1
|
|
37
|
+
* If k = 0 < n, then s(n,k) = 0
|
|
38
|
+
*
|
|
39
|
+
* Note that if either n or k is supplied as a BigNumber, the result will be
|
|
40
|
+
* as well.
|
|
32
41
|
*
|
|
33
42
|
* Syntax:
|
|
34
43
|
*
|
|
@@ -46,26 +55,47 @@ var createStirlingS2 = /* #__PURE__ */(0, _factory.factory)(name, dependencies,
|
|
|
46
55
|
* @param {Number | BigNumber} k Number of objects in the subset
|
|
47
56
|
* @return {Number | BigNumber} S(n,k)
|
|
48
57
|
*/
|
|
58
|
+
|
|
49
59
|
return typed(name, {
|
|
50
60
|
'number | BigNumber, number | BigNumber': function numberBigNumberNumberBigNumber(n, k) {
|
|
51
61
|
if (!isInteger(n) || isNegative(n) || !isInteger(k) || isNegative(k)) {
|
|
52
62
|
throw new TypeError('Non-negative integer value expected in function stirlingS2');
|
|
53
63
|
} else if (larger(k, n)) {
|
|
54
64
|
throw new TypeError('k must be less than or equal to n in function stirlingS2');
|
|
55
|
-
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
var big = !((0, _is.isNumber)(n) && (0, _is.isNumber)(k));
|
|
68
|
+
var cache = big ? bigCache : smallCache;
|
|
69
|
+
var make = big ? bignumber : number;
|
|
70
|
+
var nn = number(n);
|
|
71
|
+
var nk = number(k);
|
|
72
|
+
/* See if we already have the value: */
|
|
73
|
+
|
|
74
|
+
if (cache[nn] && cache[nn].length > nk) {
|
|
75
|
+
return cache[nn][nk];
|
|
76
|
+
}
|
|
77
|
+
/* Fill the cache */
|
|
78
|
+
|
|
56
79
|
|
|
80
|
+
for (var m = 0; m <= nn; ++m) {
|
|
81
|
+
if (!cache[m]) {
|
|
82
|
+
cache[m] = [m === 0 ? make(1) : make(0)];
|
|
83
|
+
}
|
|
57
84
|
|
|
58
|
-
|
|
59
|
-
|
|
85
|
+
if (m === 0) continue;
|
|
86
|
+
var row = cache[m];
|
|
87
|
+
var prev = cache[m - 1];
|
|
60
88
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
89
|
+
for (var i = row.length; i <= m && i <= nk; ++i) {
|
|
90
|
+
if (i === m) {
|
|
91
|
+
row[i] = 1;
|
|
92
|
+
} else {
|
|
93
|
+
row[i] = addScalar(multiplyScalar(make(i), prev[i]), prev[i - 1]);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
66
96
|
}
|
|
67
97
|
|
|
68
|
-
return
|
|
98
|
+
return cache[nn][nk];
|
|
69
99
|
}
|
|
70
100
|
});
|
|
71
101
|
});
|
|
@@ -14,14 +14,15 @@ var _string = require("../../utils/string.js");
|
|
|
14
14
|
var _factory = require("../../utils/factory.js");
|
|
15
15
|
|
|
16
16
|
var name = 'det';
|
|
17
|
-
var dependencies = ['typed', 'matrix', 'subtract', 'multiply', '
|
|
17
|
+
var dependencies = ['typed', 'matrix', 'subtract', 'multiply', 'divideScalar', 'isZero', 'unaryMinus'];
|
|
18
18
|
var createDet = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
|
|
19
19
|
var typed = _ref.typed,
|
|
20
20
|
matrix = _ref.matrix,
|
|
21
21
|
subtract = _ref.subtract,
|
|
22
22
|
multiply = _ref.multiply,
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
divideScalar = _ref.divideScalar,
|
|
24
|
+
isZero = _ref.isZero,
|
|
25
|
+
unaryMinus = _ref.unaryMinus;
|
|
25
26
|
|
|
26
27
|
/**
|
|
27
28
|
* Calculate the determinant of a matrix.
|
|
@@ -115,42 +116,47 @@ var createDet = /* #__PURE__ */(0, _factory.factory)(name, dependencies, functio
|
|
|
115
116
|
// the determinant of [a11,a12;a21,a22] is det = a11*a22-a21*a12
|
|
116
117
|
return subtract(multiply(matrix[0][0], matrix[1][1]), multiply(matrix[1][0], matrix[0][1]));
|
|
117
118
|
} else {
|
|
118
|
-
//
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
var
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
119
|
+
// Bareiss algorithm
|
|
120
|
+
// this algorithm have same complexity as LUP decomposition (O(n^3))
|
|
121
|
+
// but it preserve precision of floating point more relative to the LUP decomposition
|
|
122
|
+
var negated = false;
|
|
123
|
+
var rowIndices = new Array(rows).fill(0).map(function (_, i) {
|
|
124
|
+
return i;
|
|
125
|
+
}); // matrix index of row i
|
|
126
|
+
|
|
127
|
+
for (var k = 0; k < rows; k++) {
|
|
128
|
+
var k_ = rowIndices[k];
|
|
129
|
+
|
|
130
|
+
if (isZero(matrix[k_][k])) {
|
|
131
|
+
var _k = void 0;
|
|
132
|
+
|
|
133
|
+
for (_k = k + 1; _k < rows; _k++) {
|
|
134
|
+
if (!isZero(matrix[rowIndices[_k]][k])) {
|
|
135
|
+
k_ = rowIndices[_k];
|
|
136
|
+
rowIndices[_k] = rowIndices[k];
|
|
137
|
+
rowIndices[k] = k_;
|
|
138
|
+
negated = !negated;
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
132
142
|
|
|
133
|
-
|
|
134
|
-
while (visited[i]) {
|
|
135
|
-
i++;
|
|
143
|
+
if (_k === rows) return matrix[k_][k]; // some zero of the type
|
|
136
144
|
}
|
|
137
145
|
|
|
138
|
-
|
|
139
|
-
var
|
|
140
|
-
var cycleLen = 0;
|
|
146
|
+
var piv = matrix[k_][k];
|
|
147
|
+
var piv_ = k === 0 ? 1 : matrix[rowIndices[k - 1]][k - 1];
|
|
141
148
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
j = decomp.p[j];
|
|
145
|
-
cycleLen++;
|
|
146
|
-
}
|
|
149
|
+
for (var i = k + 1; i < rows; i++) {
|
|
150
|
+
var i_ = rowIndices[i];
|
|
147
151
|
|
|
148
|
-
|
|
149
|
-
|
|
152
|
+
for (var j = k + 1; j < rows; j++) {
|
|
153
|
+
matrix[i_][j] = divideScalar(subtract(multiply(matrix[i_][j], piv), multiply(matrix[i_][k], matrix[k_][j])), piv_);
|
|
154
|
+
}
|
|
150
155
|
}
|
|
151
156
|
}
|
|
152
157
|
|
|
153
|
-
|
|
158
|
+
var det = matrix[rowIndices[rows - 1]][rows - 1];
|
|
159
|
+
return negated ? unaryMinus(det) : det;
|
|
154
160
|
}
|
|
155
161
|
}
|
|
156
162
|
});
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createPinv = void 0;
|
|
7
|
+
|
|
8
|
+
var _is = require("../../utils/is.js");
|
|
9
|
+
|
|
10
|
+
var _array = require("../../utils/array.js");
|
|
11
|
+
|
|
12
|
+
var _factory = require("../../utils/factory.js");
|
|
13
|
+
|
|
14
|
+
var _string = require("../../utils/string.js");
|
|
15
|
+
|
|
16
|
+
var _object = require("../../utils/object.js");
|
|
17
|
+
|
|
18
|
+
var name = 'pinv';
|
|
19
|
+
var dependencies = ['typed', 'matrix', 'inv', 'deepEqual', 'equal', 'dotDivide', 'dot', 'ctranspose', 'divideScalar', 'multiply', 'add', 'Complex'];
|
|
20
|
+
var createPinv = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
|
|
21
|
+
var typed = _ref.typed,
|
|
22
|
+
matrix = _ref.matrix,
|
|
23
|
+
inv = _ref.inv,
|
|
24
|
+
deepEqual = _ref.deepEqual,
|
|
25
|
+
equal = _ref.equal,
|
|
26
|
+
dotDivide = _ref.dotDivide,
|
|
27
|
+
dot = _ref.dot,
|
|
28
|
+
ctranspose = _ref.ctranspose,
|
|
29
|
+
divideScalar = _ref.divideScalar,
|
|
30
|
+
multiply = _ref.multiply,
|
|
31
|
+
add = _ref.add,
|
|
32
|
+
Complex = _ref.Complex;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Calculate the Moore–Penrose inverse of a matrix.
|
|
36
|
+
*
|
|
37
|
+
* Syntax:
|
|
38
|
+
*
|
|
39
|
+
* math.pinv(x)
|
|
40
|
+
*
|
|
41
|
+
* Examples:
|
|
42
|
+
*
|
|
43
|
+
* math.pinv([[1, 2], [3, 4]]) // returns [[-2, 1], [1.5, -0.5]]
|
|
44
|
+
* math.pinv([[1, 0], [0, 1], [0, 1]]) // returns [[1, 0, 0], [0, 0.5, 0.5]]
|
|
45
|
+
* math.pinv(4) // returns 0.25
|
|
46
|
+
*
|
|
47
|
+
* See also:
|
|
48
|
+
*
|
|
49
|
+
* inv
|
|
50
|
+
*
|
|
51
|
+
* @param {number | Complex | Array | Matrix} x Matrix to be inversed
|
|
52
|
+
* @return {number | Complex | Array | Matrix} The inverse of `x`.
|
|
53
|
+
*/
|
|
54
|
+
return typed(name, {
|
|
55
|
+
'Array | Matrix': function ArrayMatrix(x) {
|
|
56
|
+
var size = (0, _is.isMatrix)(x) ? x.size() : (0, _array.arraySize)(x);
|
|
57
|
+
|
|
58
|
+
switch (size.length) {
|
|
59
|
+
case 1:
|
|
60
|
+
// vector
|
|
61
|
+
if (_isZeros(x)) return ctranspose(x); // null vector
|
|
62
|
+
|
|
63
|
+
if (size[0] === 1) {
|
|
64
|
+
return inv(x); // invertible matrix
|
|
65
|
+
} else {
|
|
66
|
+
return dotDivide(ctranspose(x), dot(x, x));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
case 2:
|
|
70
|
+
// two dimensional array
|
|
71
|
+
{
|
|
72
|
+
if (_isZeros(x)) return ctranspose(x); // zero matrixx
|
|
73
|
+
|
|
74
|
+
var rows = size[0];
|
|
75
|
+
var cols = size[1];
|
|
76
|
+
|
|
77
|
+
if (rows === cols) {
|
|
78
|
+
try {
|
|
79
|
+
return inv(x); // invertible matrix
|
|
80
|
+
} catch (err) {
|
|
81
|
+
if (err instanceof Error && err.message.match(/Cannot calculate inverse, determinant is zero/)) {// Expected
|
|
82
|
+
} else {
|
|
83
|
+
throw err;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if ((0, _is.isMatrix)(x)) {
|
|
89
|
+
return matrix(_pinv(x.valueOf(), rows, cols), x.storage());
|
|
90
|
+
} else {
|
|
91
|
+
// return an Array
|
|
92
|
+
return _pinv(x, rows, cols);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
default:
|
|
97
|
+
// multi dimensional array
|
|
98
|
+
throw new RangeError('Matrix must be two dimensional ' + '(size: ' + (0, _string.format)(size) + ')');
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
any: function any(x) {
|
|
102
|
+
// scalar
|
|
103
|
+
if (equal(x, 0)) return (0, _object.clone)(x); // zero
|
|
104
|
+
|
|
105
|
+
return divideScalar(1, x);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
/**
|
|
109
|
+
* Calculate the Moore–Penrose inverse of a matrix
|
|
110
|
+
* @param {Array[]} mat A matrix
|
|
111
|
+
* @param {number} rows Number of rows
|
|
112
|
+
* @param {number} cols Number of columns
|
|
113
|
+
* @return {Array[]} pinv Pseudoinverse matrix
|
|
114
|
+
* @private
|
|
115
|
+
*/
|
|
116
|
+
|
|
117
|
+
function _pinv(mat, rows, cols) {
|
|
118
|
+
var _rankFact2 = _rankFact(mat, rows, cols),
|
|
119
|
+
C = _rankFact2.C,
|
|
120
|
+
F = _rankFact2.F; // TODO: Use SVD instead (may improve precision)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
var Cpinv = multiply(inv(multiply(ctranspose(C), C)), ctranspose(C));
|
|
124
|
+
var Fpinv = multiply(ctranspose(F), inv(multiply(F, ctranspose(F))));
|
|
125
|
+
return multiply(Fpinv, Cpinv);
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Calculate the reduced row echelon form of a matrix
|
|
129
|
+
*
|
|
130
|
+
* Modified from https://rosettacode.org/wiki/Reduced_row_echelon_form
|
|
131
|
+
*
|
|
132
|
+
* @param {Array[]} mat A matrix
|
|
133
|
+
* @param {number} rows Number of rows
|
|
134
|
+
* @param {number} cols Number of columns
|
|
135
|
+
* @return {Array[]} Reduced row echelon form
|
|
136
|
+
* @private
|
|
137
|
+
*/
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
function _rref(mat, rows, cols) {
|
|
141
|
+
var M = (0, _object.clone)(mat);
|
|
142
|
+
var lead = 0;
|
|
143
|
+
|
|
144
|
+
for (var r = 0; r < rows; r++) {
|
|
145
|
+
if (cols <= lead) {
|
|
146
|
+
return M;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
var i = r;
|
|
150
|
+
|
|
151
|
+
while (_isZero(M[i][lead])) {
|
|
152
|
+
i++;
|
|
153
|
+
|
|
154
|
+
if (rows === i) {
|
|
155
|
+
i = r;
|
|
156
|
+
lead++;
|
|
157
|
+
|
|
158
|
+
if (cols === lead) {
|
|
159
|
+
return M;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
var _ref2 = [M[r], M[i]];
|
|
165
|
+
M[i] = _ref2[0];
|
|
166
|
+
M[r] = _ref2[1];
|
|
167
|
+
var val = M[r][lead];
|
|
168
|
+
|
|
169
|
+
for (var j = 0; j < cols; j++) {
|
|
170
|
+
M[r][j] = dotDivide(M[r][j], val);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
for (var _i = 0; _i < rows; _i++) {
|
|
174
|
+
if (_i === r) continue;
|
|
175
|
+
val = M[_i][lead];
|
|
176
|
+
|
|
177
|
+
for (var _j = 0; _j < cols; _j++) {
|
|
178
|
+
M[_i][_j] = add(M[_i][_j], multiply(-1, multiply(val, M[r][_j])));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
lead++;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return M;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Calculate the rank factorization of a matrix
|
|
189
|
+
*
|
|
190
|
+
* @param {Array[]} mat A matrix (M)
|
|
191
|
+
* @param {number} rows Number of rows
|
|
192
|
+
* @param {number} cols Number of columns
|
|
193
|
+
* @return {{C: Array, F: Array}} rank factorization where M = C F
|
|
194
|
+
* @private
|
|
195
|
+
*/
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
function _rankFact(mat, rows, cols) {
|
|
199
|
+
var rref = _rref(mat, rows, cols);
|
|
200
|
+
|
|
201
|
+
var C = mat.map(function (_, i) {
|
|
202
|
+
return _.filter(function (_, j) {
|
|
203
|
+
return j < rows && !_isZero(dot(rref[j], rref[j]));
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
var F = rref.filter(function (_, i) {
|
|
207
|
+
return !_isZero(dot(rref[i], rref[i]));
|
|
208
|
+
});
|
|
209
|
+
return {
|
|
210
|
+
C: C,
|
|
211
|
+
F: F
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
function _isZero(x) {
|
|
216
|
+
return equal(add(x, Complex(1, 1)), add(0, Complex(1, 1)));
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function _isZeros(arr) {
|
|
220
|
+
return deepEqual(add(arr, Complex(1, 1)), add(multiply(arr, 0), Complex(1, 1)));
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
exports.createPinv = createPinv;
|