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.
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;