mathjs 10.4.3 → 10.5.0
Sign up to get free protection for your applications and to get access to all the features.
- package/HISTORY.md +15 -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.md +2 -0
- package/lib/browser/math.js +6 -6
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/entry/dependenciesAny/dependenciesDet.generated.js +5 -2
- 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.generated.js +16 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesLgamma.generated.js +20 -0
- package/lib/cjs/entry/dependenciesNumber.generated.js +8 -0
- package/lib/cjs/entry/impureFunctionsAny.generated.js +96 -94
- package/lib/cjs/entry/impureFunctionsNumber.generated.js +5 -4
- package/lib/cjs/entry/pureFunctionsAny.generated.js +215 -193
- package/lib/cjs/entry/pureFunctionsNumber.generated.js +14 -10
- 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/factoriesAny.js +16 -0
- package/lib/cjs/factoriesNumber.js +3 -1
- package/lib/cjs/function/arithmetic/pow.js +25 -6
- 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/probability.js +43 -3
- package/lib/cjs/utils/latex.js +6 -0
- package/lib/cjs/utils/number.js +17 -2
- package/lib/cjs/version.js +1 -1
- package/lib/esm/entry/dependenciesAny/dependenciesDet.generated.js +4 -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.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesLgamma.generated.js +10 -0
- package/lib/esm/entry/dependenciesNumber.generated.js +1 -0
- package/lib/esm/entry/impureFunctionsAny.generated.js +90 -88
- package/lib/esm/entry/impureFunctionsNumber.generated.js +6 -5
- package/lib/esm/entry/pureFunctionsAny.generated.js +179 -159
- package/lib/esm/entry/pureFunctionsNumber.generated.js +8 -5
- 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/factoriesAny.js +2 -0
- package/lib/esm/factoriesNumber.js +2 -1
- package/lib/esm/function/arithmetic/pow.js +25 -6
- package/lib/esm/function/matrix/det.js +35 -31
- package/lib/esm/function/matrix/pinv.js +205 -0
- package/lib/esm/function/probability/lgamma.js +137 -0
- package/lib/esm/plain/number/probability.js +33 -1
- package/lib/esm/utils/latex.js +6 -0
- package/lib/esm/utils/number.js +13 -1
- package/lib/esm/version.js +1 -1
- package/package.json +7 -7
- package/types/index.d.ts +22 -1
- package/types/index.ts +10 -0
@@ -3,8 +3,8 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.
|
7
|
-
exports.xor = exports.xgcd = exports.version = exports.variance = exports.unequal = exports.unaryPlus = exports.unaryMinus = exports.typed = exports.typeOf = exports.tau = exports.tanh = exports.tan = exports.sum = exports.subtract = exports.subset = exports.string = exports.stirlingS2 = exports.std = exports.square = exports.sqrt = exports.smallerEq = exports.smaller = exports.size = exports.sinh = exports.sin = exports.sign = exports.sech = exports.sec = exports.round = exports.rightLogShift = exports.rightArithShift = exports.replacer = exports.range = exports.randomInt = exports.random = exports.quantileSeq = exports.prod = exports.print = exports.pow = exports.pickRandom = exports.pi = exports.phi = exports.permutations = exports.partitionSelect = exports.or = exports.numeric = exports.number = exports.nthRoot = exports.not = exports.norm = exports.multiplyScalar = exports.multiply = exports.multinomial = void 0;
|
6
|
+
exports.mod = exports.min = exports.median = exports.mean = exports.max = exports.matrix = exports.map = exports.mad = exports.log2 = exports.log1p = exports.log10 = exports.log = exports.lgamma = exports.leftShift = exports.lcm = exports.largerEq = exports.larger = exports.isZero = exports.isPrime = exports.isPositive = exports.isNumeric = exports.isNegative = exports.isNaN = exports.isInteger = exports.index = exports.hypot = exports.hasNumericValue = exports.gcd = exports.gamma = exports.format = exports.forEach = exports.floor = exports.fix = exports.filter = exports.factorial = exports.expm1 = exports.exp = exports.erf = exports.equalText = exports.equalScalar = exports.equal = exports.e = exports.divideScalar = exports.divide = exports.deepEqual = exports.cumsum = exports.cube = exports.csch = exports.csc = exports.coth = exports.cot = exports.cosh = exports.cos = exports.composition = exports.compareText = exports.compareNatural = exports.compare = exports.combinationsWithRep = exports.combinations = exports.clone = exports.ceil = exports.cbrt = exports.catalan = exports.boolean = exports.bitXor = exports.bitOr = exports.bitNot = exports.bitAnd = exports.bellNumbers = exports.atanh = exports.atan2 = exports.atan = exports.asinh = exports.asin = exports.asech = exports.asec = exports.apply = exports.and = exports.addScalar = exports.add = exports.acsch = exports.acsc = exports.acoth = exports.acot = exports.acosh = exports.acos = exports.abs = exports._true = exports._null = exports._false = exports._NaN = exports._Infinity = exports.SQRT2 = exports.SQRT1_2 = exports.ResultSet = exports.Range = exports.LOG2E = exports.LOG10E = exports.LN2 = exports.LN10 = void 0;
|
7
|
+
exports.xor = exports.xgcd = exports.version = exports.variance = exports.unequal = exports.unaryPlus = exports.unaryMinus = exports.typed = exports.typeOf = exports.tau = exports.tanh = exports.tan = exports.sum = exports.subtract = exports.subset = exports.string = exports.stirlingS2 = exports.std = exports.square = exports.sqrt = exports.smallerEq = exports.smaller = exports.size = exports.sinh = exports.sin = exports.sign = exports.sech = exports.sec = exports.round = exports.rightLogShift = exports.rightArithShift = exports.replacer = exports.range = exports.randomInt = exports.random = exports.quantileSeq = exports.prod = exports.print = exports.pow = exports.pickRandom = exports.pi = exports.phi = exports.permutations = exports.partitionSelect = exports.or = exports.numeric = exports.number = exports.nthRoot = exports.not = exports.norm = exports.multiplyScalar = exports.multiply = exports.multinomial = exports.mode = void 0;
|
8
8
|
|
9
9
|
var _configReadonly = require("./configReadonly.js");
|
10
10
|
|
@@ -233,14 +233,14 @@ var leftShift = /* #__PURE__ */(0, _factoriesNumber.createLeftShift)({
|
|
233
233
|
typed: typed
|
234
234
|
});
|
235
235
|
exports.leftShift = leftShift;
|
236
|
-
var
|
236
|
+
var log = /* #__PURE__ */(0, _factoriesNumber.createLog)({
|
237
237
|
typed: typed
|
238
238
|
});
|
239
|
-
exports.
|
240
|
-
var
|
239
|
+
exports.log = log;
|
240
|
+
var log1p = /* #__PURE__ */(0, _factoriesNumber.createLog1p)({
|
241
241
|
typed: typed
|
242
242
|
});
|
243
|
-
exports.
|
243
|
+
exports.log1p = log1p;
|
244
244
|
var map = /* #__PURE__ */(0, _factoriesNumber.createMap)({
|
245
245
|
typed: typed
|
246
246
|
});
|
@@ -398,10 +398,10 @@ var lcm = /* #__PURE__ */(0, _factoriesNumber.createLcm)({
|
|
398
398
|
typed: typed
|
399
399
|
});
|
400
400
|
exports.lcm = lcm;
|
401
|
-
var
|
401
|
+
var log10 = /* #__PURE__ */(0, _factoriesNumber.createLog10)({
|
402
402
|
typed: typed
|
403
403
|
});
|
404
|
-
exports.
|
404
|
+
exports.log10 = log10;
|
405
405
|
var multiplyScalar = /* #__PURE__ */(0, _factoriesNumber.createMultiplyScalar)({
|
406
406
|
typed: typed
|
407
407
|
});
|
@@ -495,6 +495,10 @@ var larger = /* #__PURE__ */(0, _factoriesNumber.createLarger)({
|
|
495
495
|
typed: typed
|
496
496
|
});
|
497
497
|
exports.larger = larger;
|
498
|
+
var log2 = /* #__PURE__ */(0, _factoriesNumber.createLog2)({
|
499
|
+
typed: typed
|
500
|
+
});
|
501
|
+
exports.log2 = log2;
|
498
502
|
var mode = /* #__PURE__ */(0, _factoriesNumber.createMode)({
|
499
503
|
isNaN: isNaN,
|
500
504
|
isNumeric: isNumeric,
|
@@ -610,10 +614,10 @@ var hypot = /* #__PURE__ */(0, _factoriesNumber.createHypot)({
|
|
610
614
|
typed: typed
|
611
615
|
});
|
612
616
|
exports.hypot = hypot;
|
613
|
-
var
|
617
|
+
var lgamma = /* #__PURE__ */(0, _factoriesNumber.createLgamma)({
|
614
618
|
typed: typed
|
615
619
|
});
|
616
|
-
exports.
|
620
|
+
exports.lgamma = lgamma;
|
617
621
|
var median = /* #__PURE__ */(0, _factoriesNumber.createMedian)({
|
618
622
|
add: add,
|
619
623
|
compare: compare,
|
@@ -251,6 +251,8 @@ var _identity = require("./function/matrix/identity.js");
|
|
251
251
|
|
252
252
|
var _inv = require("./function/matrix/inv.js");
|
253
253
|
|
254
|
+
var _pinv = require("./function/matrix/pinv.js");
|
255
|
+
|
254
256
|
var _kron = require("./function/matrix/kron.js");
|
255
257
|
|
256
258
|
var _map = require("./function/matrix/map.js");
|
@@ -299,6 +301,8 @@ var _factorial = require("./function/probability/factorial.js");
|
|
299
301
|
|
300
302
|
var _gamma = require("./function/probability/gamma.js");
|
301
303
|
|
304
|
+
var _lgamma = require("./function/probability/lgamma.js");
|
305
|
+
|
302
306
|
var _kldivergence = require("./function/probability/kldivergence.js");
|
303
307
|
|
304
308
|
var _multinomial = require("./function/probability/multinomial.js");
|
@@ -804,6 +808,7 @@ var embeddedDocs = {
|
|
804
808
|
flatten: _flatten.flattenDocs,
|
805
809
|
forEach: _forEach.forEachDocs,
|
806
810
|
inv: _inv.invDocs,
|
811
|
+
pinv: _pinv.pinvDocs,
|
807
812
|
eigs: _eigs.eigsDocs,
|
808
813
|
kron: _kron.kronDocs,
|
809
814
|
matrixFromFunction: _matrixFromFunction.matrixFromFunctionDocs,
|
@@ -832,6 +837,7 @@ var embeddedDocs = {
|
|
832
837
|
factorial: _factorial.factorialDocs,
|
833
838
|
gamma: _gamma.gammaDocs,
|
834
839
|
kldivergence: _kldivergence.kldivergenceDocs,
|
840
|
+
lgamma: _lgamma.lgammaDocs,
|
835
841
|
multinomial: _multinomial.multinomialDocs,
|
836
842
|
permutations: _permutations.permutationsDocs,
|
837
843
|
pickRandom: _pickRandom.pickRandomDocs,
|
@@ -9,7 +9,7 @@ var powDocs = {
|
|
9
9
|
category: 'Operators',
|
10
10
|
syntax: ['x ^ y', 'pow(x, y)'],
|
11
11
|
description: 'Calculates the power of x to y, x^y.',
|
12
|
-
examples: ['2^3', '2*2*2', '1 + e ^ (pi * i)'],
|
12
|
+
examples: ['2^3', '2*2*2', '1 + e ^ (pi * i)', 'math.pow([[1, 2], [4, 3]], 2)', 'math.pow([[1, 2], [4, 3]], -1)'],
|
13
13
|
seealso: ['multiply', 'nthRoot', 'nthRoots', 'sqrt']
|
14
14
|
};
|
15
15
|
exports.powDocs = powDocs;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.pinvDocs = void 0;
|
7
|
+
var pinvDocs = {
|
8
|
+
name: 'pinv',
|
9
|
+
category: 'Matrix',
|
10
|
+
syntax: ['pinv(x)'],
|
11
|
+
description: 'Calculate the Moore–Penrose inverse of a matrix',
|
12
|
+
examples: ['pinv([1, 2; 3, 4])', 'pinv([[1, 0], [0, 1], [0, 1]])', 'pinv(4)'],
|
13
|
+
seealso: ['inv']
|
14
|
+
};
|
15
|
+
exports.pinvDocs = pinvDocs;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.lgammaDocs = void 0;
|
7
|
+
var lgammaDocs = {
|
8
|
+
name: 'lgamma',
|
9
|
+
category: 'Probability',
|
10
|
+
syntax: ['lgamma(n)'],
|
11
|
+
description: 'Logarithm of the gamma function for real, positive numbers and complex numbers, ' + 'using Lanczos approximation for numbers and Stirling series for complex numbers.',
|
12
|
+
examples: ['lgamma(4)', 'lgamma(1/2)', 'lgamma(math.i)', 'lgamma(complex(1.1, 2))'],
|
13
|
+
seealso: ['gamma']
|
14
|
+
};
|
15
|
+
exports.lgammaDocs = lgammaDocs;
|
package/lib/cjs/factoriesAny.js
CHANGED
@@ -1011,6 +1011,12 @@ Object.defineProperty(exports, "createLeftShift", {
|
|
1011
1011
|
return _leftShift.createLeftShift;
|
1012
1012
|
}
|
1013
1013
|
});
|
1014
|
+
Object.defineProperty(exports, "createLgamma", {
|
1015
|
+
enumerable: true,
|
1016
|
+
get: function get() {
|
1017
|
+
return _lgamma.createLgamma;
|
1018
|
+
}
|
1019
|
+
});
|
1014
1020
|
Object.defineProperty(exports, "createLog", {
|
1015
1021
|
enumerable: true,
|
1016
1022
|
get: function get() {
|
@@ -1371,6 +1377,12 @@ Object.defineProperty(exports, "createPickRandom", {
|
|
1371
1377
|
return _pickRandom.createPickRandom;
|
1372
1378
|
}
|
1373
1379
|
});
|
1380
|
+
Object.defineProperty(exports, "createPinv", {
|
1381
|
+
enumerable: true,
|
1382
|
+
get: function get() {
|
1383
|
+
return _pinv.createPinv;
|
1384
|
+
}
|
1385
|
+
});
|
1374
1386
|
Object.defineProperty(exports, "createPlanckCharge", {
|
1375
1387
|
enumerable: true,
|
1376
1388
|
get: function get() {
|
@@ -2476,6 +2488,8 @@ var _det = require("./function/matrix/det.js");
|
|
2476
2488
|
|
2477
2489
|
var _inv = require("./function/matrix/inv.js");
|
2478
2490
|
|
2491
|
+
var _pinv = require("./function/matrix/pinv.js");
|
2492
|
+
|
2479
2493
|
var _eigs = require("./function/matrix/eigs.js");
|
2480
2494
|
|
2481
2495
|
var _expm2 = require("./function/matrix/expm.js");
|
@@ -2510,6 +2524,8 @@ var _combinationsWithRep = require("./function/probability/combinationsWithRep.j
|
|
2510
2524
|
|
2511
2525
|
var _gamma = require("./function/probability/gamma.js");
|
2512
2526
|
|
2527
|
+
var _lgamma = require("./function/probability/lgamma.js");
|
2528
|
+
|
2513
2529
|
var _factorial = require("./function/probability/factorial.js");
|
2514
2530
|
|
2515
2531
|
var _kldivergence = require("./function/probability/kldivergence.js");
|
@@ -338,7 +338,7 @@ Object.defineProperty(exports, "createLargerEq", {
|
|
338
338
|
}
|
339
339
|
});
|
340
340
|
exports.createLeftShift = exports.createLcm = void 0;
|
341
|
-
exports.createLog2 = exports.createLog1p = exports.createLog10 = exports.createLog = void 0;
|
341
|
+
exports.createLog2 = exports.createLog1p = exports.createLog10 = exports.createLog = exports.createLgamma = void 0;
|
342
342
|
Object.defineProperty(exports, "createMad", {
|
343
343
|
enumerable: true,
|
344
344
|
get: function get() {
|
@@ -1097,6 +1097,8 @@ var createCombinations = createNumberFactory('combinations', _index.combinations
|
|
1097
1097
|
exports.createCombinations = createCombinations;
|
1098
1098
|
var createGamma = createNumberFactory('gamma', _index.gammaNumber);
|
1099
1099
|
exports.createGamma = createGamma;
|
1100
|
+
var createLgamma = createNumberFactory('lgamma', _index.lgammaNumber);
|
1101
|
+
exports.createLgamma = createLgamma;
|
1100
1102
|
// trigonometry
|
1101
1103
|
var createAcos = /* #__PURE__ */createNumberFactory('acos', _index.acosNumber);
|
1102
1104
|
exports.createAcos = createAcos;
|
@@ -14,21 +14,25 @@ var _array = require("../../utils/array.js");
|
|
14
14
|
var _index = require("../../plain/number/index.js");
|
15
15
|
|
16
16
|
var name = 'pow';
|
17
|
-
var dependencies = ['typed', 'config', 'identity', 'multiply', 'matrix', 'fraction', 'number', 'Complex'];
|
17
|
+
var dependencies = ['typed', 'config', 'identity', 'multiply', 'matrix', 'inv', 'fraction', 'number', 'Complex'];
|
18
18
|
var createPow = /* #__PURE__ */(0, _factory.factory)(name, dependencies, function (_ref) {
|
19
19
|
var typed = _ref.typed,
|
20
20
|
config = _ref.config,
|
21
21
|
identity = _ref.identity,
|
22
22
|
multiply = _ref.multiply,
|
23
23
|
matrix = _ref.matrix,
|
24
|
+
inv = _ref.inv,
|
24
25
|
number = _ref.number,
|
25
26
|
fraction = _ref.fraction,
|
26
27
|
Complex = _ref.Complex;
|
27
28
|
|
28
29
|
/**
|
29
30
|
* Calculates the power of x to y, `x ^ y`.
|
30
|
-
*
|
31
|
-
*
|
31
|
+
*
|
32
|
+
* Matrix exponentiation is supported for square matrices `x` and integers `y`:
|
33
|
+
* when `y` is nonnegative, `x` may be any square matrix; and when `y` is
|
34
|
+
* negative, `x` must be invertible, and then this function returns
|
35
|
+
* inv(x)^(-y).
|
32
36
|
*
|
33
37
|
* For cubic roots of negative numbers, the function returns the principal
|
34
38
|
* root by default. In order to let the function return the real root,
|
@@ -49,6 +53,9 @@ var createPow = /* #__PURE__ */(0, _factory.factory)(name, dependencies, functio
|
|
49
53
|
* const b = [[1, 2], [4, 3]]
|
50
54
|
* math.pow(b, 2) // returns Array [[9, 8], [16, 17]]
|
51
55
|
*
|
56
|
+
* const c = [[1, 2], [4, 3]]
|
57
|
+
* math.pow(c, -1) // returns Array [[-0.6, 0.4], [0.8, -0.2]]
|
58
|
+
*
|
52
59
|
* See also:
|
53
60
|
*
|
54
61
|
* multiply, sqrt, cbrt, nthRoot
|
@@ -144,15 +151,15 @@ var createPow = /* #__PURE__ */(0, _factory.factory)(name, dependencies, functio
|
|
144
151
|
/**
|
145
152
|
* Calculate the power of a 2d array
|
146
153
|
* @param {Array} x must be a 2 dimensional, square matrix
|
147
|
-
* @param {number} y a positive
|
154
|
+
* @param {number} y a integer value (positive if `x` is not invertible)
|
148
155
|
* @returns {Array}
|
149
156
|
* @private
|
150
157
|
*/
|
151
158
|
|
152
159
|
|
153
160
|
function _powArray(x, y) {
|
154
|
-
if (!(0, _number.isInteger)(y)
|
155
|
-
throw new TypeError('For A^b, b must be
|
161
|
+
if (!(0, _number.isInteger)(y)) {
|
162
|
+
throw new TypeError('For A^b, b must be an integer (value is ' + y + ')');
|
156
163
|
} // verify that A is a 2 dimensional square matrix
|
157
164
|
|
158
165
|
|
@@ -166,6 +173,18 @@ var createPow = /* #__PURE__ */(0, _factory.factory)(name, dependencies, functio
|
|
166
173
|
throw new Error('For A^b, A must be square (size is ' + s[0] + 'x' + s[1] + ')');
|
167
174
|
}
|
168
175
|
|
176
|
+
if (y < 0) {
|
177
|
+
try {
|
178
|
+
return _powArray(inv(x), -y);
|
179
|
+
} catch (error) {
|
180
|
+
if (error.message === 'Cannot calculate inverse, determinant is zero') {
|
181
|
+
throw new TypeError('For A^b, when A is not invertible, b must be a positive integer (value is ' + y + ')');
|
182
|
+
}
|
183
|
+
|
184
|
+
throw error;
|
185
|
+
}
|
186
|
+
}
|
187
|
+
|
169
188
|
var res = identity(s[0]).valueOf();
|
170
189
|
var px = x;
|
171
190
|
|
@@ -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;
|