mathjs 10.4.2 → 10.5.1
Sign up to get free protection for your applications and to get access to all the features.
- 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;
|