mathjs 10.4.3 → 10.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. package/HISTORY.md +15 -0
  2. package/docs/reference/functions/lgamma.md +46 -0
  3. package/docs/reference/functions/pinv.md +44 -0
  4. package/docs/reference/functions/pow.md +8 -2
  5. package/docs/reference/functions.md +2 -0
  6. package/lib/browser/math.js +6 -6
  7. package/lib/browser/math.js.map +1 -1
  8. package/lib/cjs/entry/dependenciesAny/dependenciesDet.generated.js +5 -2
  9. package/lib/cjs/entry/dependenciesAny/dependenciesLgamma.generated.js +23 -0
  10. package/lib/cjs/entry/dependenciesAny/dependenciesPinv.generated.js +53 -0
  11. package/lib/cjs/entry/dependenciesAny/dependenciesPow.generated.js +3 -0
  12. package/lib/cjs/entry/dependenciesAny.generated.js +16 -0
  13. package/lib/cjs/entry/dependenciesNumber/dependenciesLgamma.generated.js +20 -0
  14. package/lib/cjs/entry/dependenciesNumber.generated.js +8 -0
  15. package/lib/cjs/entry/impureFunctionsAny.generated.js +96 -94
  16. package/lib/cjs/entry/impureFunctionsNumber.generated.js +5 -4
  17. package/lib/cjs/entry/pureFunctionsAny.generated.js +215 -193
  18. package/lib/cjs/entry/pureFunctionsNumber.generated.js +14 -10
  19. package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +6 -0
  20. package/lib/cjs/expression/embeddedDocs/function/arithmetic/pow.js +1 -1
  21. package/lib/cjs/expression/embeddedDocs/function/matrix/pinv.js +15 -0
  22. package/lib/cjs/expression/embeddedDocs/function/probability/lgamma.js +15 -0
  23. package/lib/cjs/factoriesAny.js +16 -0
  24. package/lib/cjs/factoriesNumber.js +3 -1
  25. package/lib/cjs/function/arithmetic/pow.js +25 -6
  26. package/lib/cjs/function/matrix/det.js +37 -31
  27. package/lib/cjs/function/matrix/pinv.js +223 -0
  28. package/lib/cjs/function/probability/lgamma.js +146 -0
  29. package/lib/cjs/header.js +2 -2
  30. package/lib/cjs/plain/number/probability.js +43 -3
  31. package/lib/cjs/utils/latex.js +6 -0
  32. package/lib/cjs/utils/number.js +17 -2
  33. package/lib/cjs/version.js +1 -1
  34. package/lib/esm/entry/dependenciesAny/dependenciesDet.generated.js +4 -2
  35. package/lib/esm/entry/dependenciesAny/dependenciesLgamma.generated.js +12 -0
  36. package/lib/esm/entry/dependenciesAny/dependenciesPinv.generated.js +32 -0
  37. package/lib/esm/entry/dependenciesAny/dependenciesPow.generated.js +2 -0
  38. package/lib/esm/entry/dependenciesAny.generated.js +2 -0
  39. package/lib/esm/entry/dependenciesNumber/dependenciesLgamma.generated.js +10 -0
  40. package/lib/esm/entry/dependenciesNumber.generated.js +1 -0
  41. package/lib/esm/entry/impureFunctionsAny.generated.js +90 -88
  42. package/lib/esm/entry/impureFunctionsNumber.generated.js +6 -5
  43. package/lib/esm/entry/pureFunctionsAny.generated.js +179 -159
  44. package/lib/esm/entry/pureFunctionsNumber.generated.js +8 -5
  45. package/lib/esm/expression/embeddedDocs/embeddedDocs.js +4 -0
  46. package/lib/esm/expression/embeddedDocs/function/arithmetic/pow.js +1 -1
  47. package/lib/esm/expression/embeddedDocs/function/matrix/pinv.js +8 -0
  48. package/lib/esm/expression/embeddedDocs/function/probability/lgamma.js +8 -0
  49. package/lib/esm/factoriesAny.js +2 -0
  50. package/lib/esm/factoriesNumber.js +2 -1
  51. package/lib/esm/function/arithmetic/pow.js +25 -6
  52. package/lib/esm/function/matrix/det.js +35 -31
  53. package/lib/esm/function/matrix/pinv.js +205 -0
  54. package/lib/esm/function/probability/lgamma.js +137 -0
  55. package/lib/esm/plain/number/probability.js +33 -1
  56. package/lib/esm/utils/latex.js +6 -0
  57. package/lib/esm/utils/number.js +13 -1
  58. package/lib/esm/version.js +1 -1
  59. package/package.json +7 -7
  60. package/types/index.d.ts +22 -1
  61. package/types/index.ts +10 -0
@@ -3,8 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.mode = 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.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 = 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 log10 = /* #__PURE__ */(0, _factoriesNumber.createLog10)({
236
+ var log = /* #__PURE__ */(0, _factoriesNumber.createLog)({
237
237
  typed: typed
238
238
  });
239
- exports.log10 = log10;
240
- var log2 = /* #__PURE__ */(0, _factoriesNumber.createLog2)({
239
+ exports.log = log;
240
+ var log1p = /* #__PURE__ */(0, _factoriesNumber.createLog1p)({
241
241
  typed: typed
242
242
  });
243
- exports.log2 = log2;
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 log1p = /* #__PURE__ */(0, _factoriesNumber.createLog1p)({
401
+ var log10 = /* #__PURE__ */(0, _factoriesNumber.createLog10)({
402
402
  typed: typed
403
403
  });
404
- exports.log1p = log1p;
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 log = /* #__PURE__ */(0, _factoriesNumber.createLog)({
617
+ var lgamma = /* #__PURE__ */(0, _factoriesNumber.createLgamma)({
614
618
  typed: typed
615
619
  });
616
- exports.log = log;
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;
@@ -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
- * Matrix exponentiation is supported for square matrices `x`, and positive
31
- * integer exponents `y`.
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, integer value
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) || y < 0) {
155
- throw new TypeError('For A^b, b must be a positive integer (value is ' + y + ')');
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', 'unaryMinus', 'lup'];
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
- unaryMinus = _ref.unaryMinus,
24
- lup = _ref.lup;
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
- // Compute the LU decomposition
119
- var decomp = lup(matrix); // The determinant is the product of the diagonal entries of U (and those of L, but they are all 1)
120
-
121
- var det = decomp.U[0][0];
122
-
123
- for (var _i = 1; _i < rows; _i++) {
124
- det = multiply(det, decomp.U[_i][_i]);
125
- } // The determinant will be multiplied by 1 or -1 depending on the parity of the permutation matrix.
126
- // This can be determined by counting the cycles. This is roughly a linear time algorithm.
127
-
128
-
129
- var evenCycles = 0;
130
- var i = 0;
131
- var visited = [];
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
- while (true) {
134
- while (visited[i]) {
135
- i++;
143
+ if (_k === rows) return matrix[k_][k]; // some zero of the type
136
144
  }
137
145
 
138
- if (i >= rows) break;
139
- var j = i;
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
- while (!visited[decomp.p[j]]) {
143
- visited[decomp.p[j]] = true;
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
- if (cycleLen % 2 === 0) {
149
- evenCycles++;
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
- return evenCycles % 2 === 0 ? det : unaryMinus(det);
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;