mathjs 10.4.3 → 10.5.0
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 +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;
|