mathjs 11.12.0 → 12.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. package/HISTORY.md +54 -2
  2. package/README.md +1 -1
  3. package/lib/browser/math.js +1 -1
  4. package/lib/browser/math.js.LICENSE.txt +2 -2
  5. package/lib/browser/math.js.map +1 -1
  6. package/lib/cjs/entry/dependenciesAny/dependenciesEigs.generated.js +4 -0
  7. package/lib/cjs/entry/pureFunctionsAny.generated.js +2 -0
  8. package/lib/cjs/expression/embeddedDocs/function/arithmetic/round.js +2 -2
  9. package/lib/cjs/expression/embeddedDocs/function/matrix/eigs.js +2 -2
  10. package/lib/cjs/expression/node/AssignmentNode.js +1 -1
  11. package/lib/cjs/expression/node/FunctionAssignmentNode.js +1 -1
  12. package/lib/cjs/function/algebra/derivative.js +8 -31
  13. package/lib/cjs/function/arithmetic/gcd.js +4 -5
  14. package/lib/cjs/function/arithmetic/mod.js +2 -9
  15. package/lib/cjs/function/arithmetic/round.js +59 -16
  16. package/lib/cjs/function/matrix/eigs/complexEigs.js +73 -68
  17. package/lib/cjs/function/matrix/eigs/{realSymetric.js → realSymmetric.js} +57 -51
  18. package/lib/cjs/function/matrix/eigs.js +118 -45
  19. package/lib/cjs/function/probability/pickRandom.js +2 -2
  20. package/lib/cjs/header.js +2 -2
  21. package/lib/cjs/type/number.js +2 -2
  22. package/lib/cjs/utils/number.js +1 -1
  23. package/lib/cjs/utils/snapshot.js +6 -6
  24. package/lib/cjs/version.js +1 -1
  25. package/lib/esm/entry/dependenciesAny/dependenciesEigs.generated.js +4 -0
  26. package/lib/esm/entry/pureFunctionsAny.generated.js +2 -0
  27. package/lib/esm/expression/embeddedDocs/function/arithmetic/round.js +2 -2
  28. package/lib/esm/expression/embeddedDocs/function/matrix/eigs.js +2 -2
  29. package/lib/esm/expression/node/AssignmentNode.js +1 -1
  30. package/lib/esm/expression/node/FunctionAssignmentNode.js +1 -1
  31. package/lib/esm/function/algebra/derivative.js +8 -31
  32. package/lib/esm/function/arithmetic/mod.js +2 -9
  33. package/lib/esm/function/arithmetic/round.js +40 -17
  34. package/lib/esm/function/matrix/eigs/complexEigs.js +73 -68
  35. package/lib/esm/function/matrix/eigs/{realSymetric.js → realSymmetric.js} +55 -51
  36. package/lib/esm/function/matrix/eigs.js +119 -47
  37. package/lib/esm/function/probability/pickRandom.js +2 -2
  38. package/lib/esm/type/number.js +2 -2
  39. package/lib/esm/utils/number.js +1 -1
  40. package/lib/esm/version.js +1 -1
  41. package/package.json +14 -14
  42. package/types/EXPLANATION.md +54 -0
  43. package/types/index.d.ts +6825 -6483
@@ -11,6 +11,8 @@ export function createComplexEigs(_ref) {
11
11
  abs,
12
12
  bignumber,
13
13
  diag,
14
+ size,
15
+ reshape,
14
16
  inv,
15
17
  qr,
16
18
  usolve,
@@ -31,11 +33,8 @@ export function createComplexEigs(_ref) {
31
33
  *
32
34
  * @returns {{ values: number[], vectors: number[][] }}
33
35
  */
34
- function complexEigs(arr, N, prec, type, findVectors) {
35
- if (findVectors === undefined) {
36
- findVectors = true;
37
- }
38
-
36
+ function complexEigs(arr, N, prec, type) {
37
+ var findVectors = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
39
38
  // TODO check if any row/col are zero except the diagonal
40
39
 
41
40
  // make sure corresponding rows and columns have similar magnitude
@@ -44,9 +43,9 @@ export function createComplexEigs(_ref) {
44
43
  var R = balance(arr, N, prec, type, findVectors);
45
44
 
46
45
  // R is the row transformation matrix
47
- // arr = A' = R A R⁻¹, A is the original matrix
46
+ // arr = A' = R A R^-1, A is the original matrix
48
47
  // (if findVectors is false, R is undefined)
49
- // (And so to return to original matrix: A = R⁻¹ arr R)
48
+ // (And so to return to original matrix: A = R^-1 arr R)
50
49
 
51
50
  // TODO if magnitudes of elements vary over many orders,
52
51
  // move greatest elements to the top left corner
@@ -56,7 +55,7 @@ export function createComplexEigs(_ref) {
56
55
  // updates the transformation matrix R with new row operationsq
57
56
  // MODIFIES arr by side effect!
58
57
  reduceToHessenberg(arr, N, prec, type, findVectors, R);
59
- // still true that original A = R⁻¹ arr R)
58
+ // still true that original A = R^-1 arr R)
60
59
 
61
60
  // find eigenvalues
62
61
  var {
@@ -67,17 +66,18 @@ export function createComplexEigs(_ref) {
67
66
  // values is the list of eigenvalues, C is the column
68
67
  // transformation matrix that transforms arr, the hessenberg
69
68
  // matrix, to upper triangular
70
- // (So U = C⁻¹ arr C and the relationship between current arr
69
+ // (So U = C^-1 arr C and the relationship between current arr
71
70
  // and original A is unchanged.)
72
71
 
73
- var vectors;
74
72
  if (findVectors) {
75
- vectors = findEigenvectors(arr, N, C, R, values, prec, type);
76
- vectors = matrixFromColumns(...vectors);
73
+ var eigenvectors = findEigenvectors(arr, N, C, R, values, prec, type);
74
+ return {
75
+ values,
76
+ eigenvectors
77
+ };
77
78
  }
78
79
  return {
79
- values,
80
- vectors
80
+ values
81
81
  };
82
82
  }
83
83
 
@@ -117,9 +117,8 @@ export function createComplexEigs(_ref) {
117
117
  var rowNorm = realzero;
118
118
  for (var j = 0; j < N; j++) {
119
119
  if (i === j) continue;
120
- var c = abs(arr[i][j]); // should be real
121
- colNorm = addScalar(colNorm, c);
122
- rowNorm = addScalar(rowNorm, c);
120
+ colNorm = addScalar(colNorm, abs(arr[j][i]));
121
+ rowNorm = addScalar(rowNorm, abs(arr[i][j]));
123
122
  }
124
123
  if (!equal(colNorm, 0) && !equal(rowNorm, 0)) {
125
124
  // find integer power closest to balancing the matrix
@@ -127,21 +126,21 @@ export function createComplexEigs(_ref) {
127
126
  // so that we don't lose any precision due to round-off)
128
127
 
129
128
  var f = realone;
130
- var _c = colNorm;
129
+ var c = colNorm;
131
130
  var rowDivRadix = divideScalar(rowNorm, radix);
132
131
  var rowMulRadix = multiplyScalar(rowNorm, radix);
133
- while (smaller(_c, rowDivRadix)) {
134
- _c = multiplyScalar(_c, radixSq);
132
+ while (smaller(c, rowDivRadix)) {
133
+ c = multiplyScalar(c, radixSq);
135
134
  f = multiplyScalar(f, radix);
136
135
  }
137
- while (larger(_c, rowMulRadix)) {
138
- _c = divideScalar(_c, radixSq);
136
+ while (larger(c, rowMulRadix)) {
137
+ c = divideScalar(c, radixSq);
139
138
  f = divideScalar(f, radix);
140
139
  }
141
140
 
142
141
  // check whether balancing is needed
143
142
  // condition = (c + rowNorm) / f < 0.95 * (colNorm + rowNorm)
144
- var condition = smaller(divideScalar(addScalar(_c, rowNorm), f), multiplyScalar(addScalar(colNorm, rowNorm), 0.95));
143
+ var condition = smaller(divideScalar(addScalar(c, rowNorm), f), multiplyScalar(addScalar(colNorm, rowNorm), 0.95));
145
144
 
146
145
  // apply balancing similarity transformation
147
146
  if (condition) {
@@ -153,13 +152,13 @@ export function createComplexEigs(_ref) {
153
152
  if (i === _j) {
154
153
  continue;
155
154
  }
156
- arr[i][_j] = multiplyScalar(arr[i][_j], f);
157
- arr[_j][i] = multiplyScalar(arr[_j][i], g);
155
+ arr[i][_j] = multiplyScalar(arr[i][_j], g);
156
+ arr[_j][i] = multiplyScalar(arr[_j][i], f);
158
157
  }
159
158
 
160
159
  // keep track of transformations
161
160
  if (findVectors) {
162
- Rdiag[i] = multiplyScalar(Rdiag[i], f);
161
+ Rdiag[i] = multiplyScalar(Rdiag[i], g);
163
162
  }
164
163
  }
165
164
  }
@@ -167,7 +166,7 @@ export function createComplexEigs(_ref) {
167
166
  }
168
167
 
169
168
  // return the diagonal row transformation matrix
170
- return diag(Rdiag);
169
+ return findVectors ? diag(Rdiag) : null;
171
170
  }
172
171
 
173
172
  /**
@@ -266,7 +265,7 @@ export function createComplexEigs(_ref) {
266
265
 
267
266
  // The Francis Algorithm
268
267
  // The core idea of this algorithm is that doing successive
269
- // A' = Q⁺AQ transformations will eventually converge to block-
268
+ // A' = QtAQ transformations will eventually converge to block-
270
269
  // upper-triangular with diagonal blocks either 1x1 or 2x2.
271
270
  // The Q here is the one from the QR decomposition, A = QR.
272
271
  // Since the eigenvalues of a block-upper-triangular matrix are
@@ -288,7 +287,7 @@ export function createComplexEigs(_ref) {
288
287
  // N×N matrix describing the overall transformation done during the QR algorithm
289
288
  var Qtotal = findVectors ? diag(Array(N).fill(one)) : undefined;
290
289
 
291
- // n×n matrix describing the QR transformations done since last convergence
290
+ // nxn matrix describing the QR transformations done since last convergence
292
291
  var Qpartial = findVectors ? diag(Array(n).fill(one)) : undefined;
293
292
 
294
293
  // last eigenvalue converged before this many steps
@@ -300,7 +299,12 @@ export function createComplexEigs(_ref) {
300
299
 
301
300
  // Perform the factorization
302
301
 
303
- var k = 0; // TODO set close to an eigenvalue
302
+ var k = arr[n - 1][n - 1]; // TODO this is apparently a somewhat
303
+ // old-fashioned choice; ideally set close to an eigenvalue, or
304
+ // perhaps better yet switch to the implicit QR version that is sometimes
305
+ // specifically called the "Francis algorithm" that is alluded to
306
+ // in the following TODO. (Or perhaps we switch to an independently
307
+ // optimized third-party package for the linear algebra operations...)
304
308
 
305
309
  for (var i = 0; i < n; i++) {
306
310
  arr[i][i] = subtract(arr[i][i], k);
@@ -414,17 +418,17 @@ export function createComplexEigs(_ref) {
414
418
  // this way it is easier to find eigenvectors
415
419
  var uniqueValues = [];
416
420
  var multiplicities = [];
417
- for (var λ of values) {
418
- var i = indexOf(uniqueValues, λ, equal);
421
+ for (var lambda of values) {
422
+ var i = indexOf(uniqueValues, lambda, equal);
419
423
  if (i === -1) {
420
- uniqueValues.push(λ);
424
+ uniqueValues.push(lambda);
421
425
  multiplicities.push(1);
422
426
  } else {
423
427
  multiplicities[i] += 1;
424
428
  }
425
429
  }
426
430
 
427
- // find eigenvectors by solving U − λE = 0
431
+ // find eigenvectors by solving U − lambdaE = 0
428
432
  // TODO replace with an iterative eigenvector algorithm
429
433
  // (this one might fail for imprecise eigenvalues)
430
434
 
@@ -432,41 +436,35 @@ export function createComplexEigs(_ref) {
432
436
  var len = uniqueValues.length;
433
437
  var b = Array(N).fill(zero);
434
438
  var E = diag(Array(N).fill(one));
435
-
436
- // eigenvalues for which usolve failed (due to numerical error)
437
- var failedLambdas = [];
438
439
  var _loop = function _loop() {
439
- var λ = uniqueValues[_i4];
440
- var S = subtract(U, multiply(λ, E)); // the characteristic matrix
440
+ var lambda = uniqueValues[_i4];
441
+ var S = subtract(U, multiply(lambda, E)); // the characteristic matrix
441
442
 
442
443
  var solutions = usolveAll(S, b);
443
444
  solutions.shift(); // ignore the null vector
444
445
 
445
446
  // looks like we missed something, try inverse iteration
447
+ // But if that fails, just presume that the original matrix truly
448
+ // was defective.
446
449
  while (solutions.length < multiplicities[_i4]) {
447
450
  var approxVec = inverseIterate(S, N, solutions, prec, type);
448
- if (approxVec == null) {
449
- // no more vectors were found
450
- failedLambdas.push(λ);
451
+ if (approxVec === null) {
451
452
  break;
452
- }
453
+ } // no more vectors were found
453
454
  solutions.push(approxVec);
454
455
  }
455
456
 
456
457
  // Transform back into original array coordinates
457
458
  var correction = multiply(inv(R), C);
458
459
  solutions = solutions.map(v => multiply(correction, v));
459
- vectors.push(...solutions.map(v => flatten(v)));
460
+ vectors.push(...solutions.map(v => ({
461
+ value: lambda,
462
+ vector: flatten(v)
463
+ })));
460
464
  };
461
465
  for (var _i4 = 0; _i4 < len; _i4++) {
462
466
  _loop();
463
467
  }
464
- if (failedLambdas.length !== 0) {
465
- var err = new Error('Failed to find eigenvectors for the following eigenvalues: ' + failedLambdas.join(', '));
466
- err.values = values;
467
- err.vectors = vectors;
468
- throw err;
469
- }
470
468
  return vectors;
471
469
  }
472
470
 
@@ -475,7 +473,7 @@ export function createComplexEigs(_ref) {
475
473
  * @return {[number,number]}
476
474
  */
477
475
  function eigenvalues2x2(a, b, c, d) {
478
- // λ± = ½ trA ± ½ ( tr²A - 4 detA )
476
+ // lambda_+- = 1/2 trA +- 1/2 sqrt( tr^2 A - 4 detA )
479
477
  var trA = addScalar(a, d);
480
478
  var detA = subtract(multiplyScalar(a, d), multiplyScalar(b, c));
481
479
  var x = multiplyScalar(trA, 0.5);
@@ -485,7 +483,7 @@ export function createComplexEigs(_ref) {
485
483
 
486
484
  /**
487
485
  * For an 2x2 matrix compute the transformation matrix S,
488
- * so that SAS⁻¹ is an upper triangular matrix
486
+ * so that SAS^-1 is an upper triangular matrix
489
487
  * @return {[[number,number],[number,number]]}
490
488
  * @see https://math.berkeley.edu/~ogus/old/Math_54-05/webfoils/jordan.pdf
491
489
  * @see http://people.math.harvard.edu/~knill/teaching/math21b2004/exhibits/2dmatrices/index.html
@@ -509,23 +507,22 @@ export function createComplexEigs(_ref) {
509
507
  }
510
508
 
511
509
  // matrix is not diagonalizable
512
- // compute off-diagonal elements of N = A - λI
513
- // N₁₂ = 0 ⇒ S = ( N⃗₁, I⃗₁ )
514
- // N₁₂ ≠ 0 ⇒ S = ( N⃗₂, I⃗₂ )
515
-
510
+ // compute diagonal elements of N = A - lambdaI
516
511
  var na = subtract(a, l1);
517
- var nb = subtract(b, l1);
518
- var nc = subtract(c, l1);
519
512
  var nd = subtract(d, l1);
520
- if (smaller(abs(nb), prec)) {
521
- return [[na, one], [nc, zero]];
513
+
514
+ // col(N,2) = 0 implies S = ( col(N,1), e_1 )
515
+ // col(N,2) != 0 implies S = ( col(N,2), e_2 )
516
+
517
+ if (smaller(abs(b), prec) && smaller(abs(nd), prec)) {
518
+ return [[na, one], [c, zero]];
522
519
  } else {
523
- return [[nb, zero], [nd, one]];
520
+ return [[b, zero], [nd, one]];
524
521
  }
525
522
  }
526
523
 
527
524
  /**
528
- * Enlarge the matrix from n×n to N×N, setting the new
525
+ * Enlarge the matrix from nxn to NxN, setting the new
529
526
  * elements to 1 on diagonal and 0 elsewhere
530
527
  */
531
528
  function inflateMatrix(arr, N) {
@@ -602,15 +599,21 @@ export function createComplexEigs(_ref) {
602
599
 
603
600
  // you better choose a random vector before I count to five
604
601
  var i = 0;
605
- while (true) {
602
+ for (; i < 5; ++i) {
606
603
  b = randomOrthogonalVector(N, orthog, type);
607
- b = usolve(A, b);
604
+ try {
605
+ b = usolve(A, b);
606
+ } catch (_unused) {
607
+ // That direction didn't work, likely because the original matrix
608
+ // was defective. But still make the full number of tries...
609
+ continue;
610
+ }
608
611
  if (larger(norm(b), largeNum)) {
609
612
  break;
610
613
  }
611
- if (++i >= 5) {
612
- return null;
613
- }
614
+ }
615
+ if (i >= 5) {
616
+ return null; // couldn't find any orthogonal vector in the image
614
617
  }
615
618
 
616
619
  // you better converge before I count to ten
@@ -660,8 +663,10 @@ export function createComplexEigs(_ref) {
660
663
  * Project vector v to the orthogonal complement of an array of vectors
661
664
  */
662
665
  function orthogonalComplement(v, orthog) {
666
+ var vectorShape = size(v);
663
667
  for (var w of orthog) {
664
- // v := v − (w, v)/∥w∥² w
668
+ w = reshape(w, vectorShape); // make sure this is just a vector computation
669
+ // v := v − (w, v)/|w|^2 w
665
670
  v = subtract(v, multiply(divideScalar(dot(w, v), dot(w, w)), w));
666
671
  }
667
672
  return v;
@@ -23,25 +23,29 @@ export function createRealSymmetric(_ref) {
23
23
  function main(arr, N) {
24
24
  var prec = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : config.epsilon;
25
25
  var type = arguments.length > 3 ? arguments[3] : undefined;
26
+ var computeVectors = arguments.length > 4 ? arguments[4] : undefined;
26
27
  if (type === 'number') {
27
- return diag(arr, prec);
28
+ return diag(arr, prec, computeVectors);
28
29
  }
29
30
  if (type === 'BigNumber') {
30
- return diagBig(arr, prec);
31
+ return diagBig(arr, prec, computeVectors);
31
32
  }
32
33
  throw TypeError('Unsupported data type: ' + type);
33
34
  }
34
35
 
35
36
  // diagonalization implementation for number (efficient)
36
- function diag(x, precision) {
37
+ function diag(x, precision, computeVectors) {
37
38
  var N = x.length;
38
39
  var e0 = Math.abs(precision / N);
39
40
  var psi;
40
- var Sij = new Array(N);
41
- // Sij is Identity Matrix
42
- for (var i = 0; i < N; i++) {
43
- Sij[i] = createArray(N, 0);
44
- Sij[i][i] = 1.0;
41
+ var Sij;
42
+ if (computeVectors) {
43
+ Sij = new Array(N);
44
+ // Sij is Identity Matrix
45
+ for (var i = 0; i < N; i++) {
46
+ Sij[i] = Array(N).fill(0);
47
+ Sij[i][i] = 1.0;
48
+ }
45
49
  }
46
50
  // initial error
47
51
  var Vab = getAij(x);
@@ -50,26 +54,29 @@ export function createRealSymmetric(_ref) {
50
54
  var j = Vab[0][1];
51
55
  psi = getTheta(x[_i][_i], x[j][j], x[_i][j]);
52
56
  x = x1(x, psi, _i, j);
53
- Sij = Sij1(Sij, psi, _i, j);
57
+ if (computeVectors) Sij = Sij1(Sij, psi, _i, j);
54
58
  Vab = getAij(x);
55
59
  }
56
- var Ei = createArray(N, 0); // eigenvalues
60
+ var Ei = Array(N).fill(0); // eigenvalues
57
61
  for (var _i2 = 0; _i2 < N; _i2++) {
58
62
  Ei[_i2] = x[_i2][_i2];
59
63
  }
60
- return sorting(clone(Ei), clone(Sij));
64
+ return sorting(clone(Ei), Sij, computeVectors);
61
65
  }
62
66
 
63
67
  // diagonalization implementation for bigNumber
64
- function diagBig(x, precision) {
68
+ function diagBig(x, precision, computeVectors) {
65
69
  var N = x.length;
66
70
  var e0 = abs(precision / N);
67
71
  var psi;
68
- var Sij = new Array(N);
69
- // Sij is Identity Matrix
70
- for (var i = 0; i < N; i++) {
71
- Sij[i] = createArray(N, 0);
72
- Sij[i][i] = 1.0;
72
+ var Sij;
73
+ if (computeVectors) {
74
+ Sij = new Array(N);
75
+ // Sij is Identity Matrix
76
+ for (var i = 0; i < N; i++) {
77
+ Sij[i] = Array(N).fill(0);
78
+ Sij[i][i] = 1.0;
79
+ }
73
80
  }
74
81
  // initial error
75
82
  var Vab = getAijBig(x);
@@ -78,15 +85,15 @@ export function createRealSymmetric(_ref) {
78
85
  var j = Vab[0][1];
79
86
  psi = getThetaBig(x[_i3][_i3], x[j][j], x[_i3][j]);
80
87
  x = x1Big(x, psi, _i3, j);
81
- Sij = Sij1Big(Sij, psi, _i3, j);
88
+ if (computeVectors) Sij = Sij1Big(Sij, psi, _i3, j);
82
89
  Vab = getAijBig(x);
83
90
  }
84
- var Ei = createArray(N, 0); // eigenvalues
91
+ var Ei = Array(N).fill(0); // eigenvalues
85
92
  for (var _i4 = 0; _i4 < N; _i4++) {
86
93
  Ei[_i4] = x[_i4][_i4];
87
94
  }
88
95
  // return [clone(Ei), clone(Sij)]
89
- return sorting(clone(Ei), clone(Sij));
96
+ return sorting(clone(Ei), Sij, computeVectors);
90
97
  }
91
98
 
92
99
  // get angle
@@ -114,8 +121,8 @@ export function createRealSymmetric(_ref) {
114
121
  var N = Sij.length;
115
122
  var c = Math.cos(theta);
116
123
  var s = Math.sin(theta);
117
- var Ski = createArray(N, 0);
118
- var Skj = createArray(N, 0);
124
+ var Ski = Array(N).fill(0);
125
+ var Skj = Array(N).fill(0);
119
126
  for (var k = 0; k < N; k++) {
120
127
  Ski[k] = c * Sij[k][i] - s * Sij[k][j];
121
128
  Skj[k] = s * Sij[k][i] + c * Sij[k][j];
@@ -131,8 +138,8 @@ export function createRealSymmetric(_ref) {
131
138
  var N = Sij.length;
132
139
  var c = cos(theta);
133
140
  var s = sin(theta);
134
- var Ski = createArray(N, bignumber(0));
135
- var Skj = createArray(N, bignumber(0));
141
+ var Ski = Array(N).fill(bignumber(0));
142
+ var Skj = Array(N).fill(bignumber(0));
136
143
  for (var k = 0; k < N; k++) {
137
144
  Ski[k] = subtract(multiplyScalar(c, Sij[k][i]), multiplyScalar(s, Sij[k][j]));
138
145
  Skj[k] = addScalar(multiplyScalar(s, Sij[k][i]), multiplyScalar(c, Sij[k][j]));
@@ -151,8 +158,8 @@ export function createRealSymmetric(_ref) {
151
158
  var s = bignumber(sin(theta));
152
159
  var c2 = multiplyScalar(c, c);
153
160
  var s2 = multiplyScalar(s, s);
154
- var Aki = createArray(N, bignumber(0));
155
- var Akj = createArray(N, bignumber(0));
161
+ var Aki = Array(N).fill(bignumber(0));
162
+ var Akj = Array(N).fill(bignumber(0));
156
163
  // 2cs Hij
157
164
  var csHij = multiply(bignumber(2), c, s, Hij[i][j]);
158
165
  // Aii
@@ -187,8 +194,8 @@ export function createRealSymmetric(_ref) {
187
194
  var s = Math.sin(theta);
188
195
  var c2 = c * c;
189
196
  var s2 = s * s;
190
- var Aki = createArray(N, 0);
191
- var Akj = createArray(N, 0);
197
+ var Aki = Array(N).fill(0);
198
+ var Akj = Array(N).fill(0);
192
199
  // Aii
193
200
  var Aii = c2 * Hij[i][i] - 2 * c * s * Hij[i][j] + s2 * Hij[j][j];
194
201
  var Ajj = s2 * Hij[i][i] + 2 * c * s * Hij[i][j] + c2 * Hij[j][j];
@@ -247,12 +254,15 @@ export function createRealSymmetric(_ref) {
247
254
  }
248
255
 
249
256
  // sort results
250
- function sorting(E, S) {
257
+ function sorting(E, S, computeVectors) {
251
258
  var N = E.length;
252
259
  var values = Array(N);
253
- var vectors = Array(N);
254
- for (var k = 0; k < N; k++) {
255
- vectors[k] = Array(N);
260
+ var vecs;
261
+ if (computeVectors) {
262
+ vecs = Array(N);
263
+ for (var k = 0; k < N; k++) {
264
+ vecs[k] = Array(N);
265
+ }
256
266
  }
257
267
  for (var i = 0; i < N; i++) {
258
268
  var minID = 0;
@@ -264,30 +274,24 @@ export function createRealSymmetric(_ref) {
264
274
  }
265
275
  }
266
276
  values[i] = E.splice(minID, 1)[0];
267
- for (var _k5 = 0; _k5 < N; _k5++) {
268
- vectors[_k5][i] = S[_k5][minID];
269
- S[_k5].splice(minID, 1);
277
+ if (computeVectors) {
278
+ for (var _k5 = 0; _k5 < N; _k5++) {
279
+ vecs[i][_k5] = S[_k5][minID];
280
+ S[_k5].splice(minID, 1);
281
+ }
270
282
  }
271
283
  }
284
+ if (!computeVectors) return {
285
+ values
286
+ };
287
+ var eigenvectors = vecs.map((vector, i) => ({
288
+ value: values[i],
289
+ vector
290
+ }));
272
291
  return {
273
292
  values,
274
- vectors
293
+ eigenvectors
275
294
  };
276
295
  }
277
-
278
- /**
279
- * Create an array of a certain size and fill all items with an initial value
280
- * @param {number} size
281
- * @param {number} value
282
- * @return {number[]}
283
- */
284
- function createArray(size, value) {
285
- // TODO: as soon as all browsers support Array.fill, use that instead (IE doesn't support it)
286
- var array = new Array(size);
287
- for (var i = 0; i < size; i++) {
288
- array[i] = value;
289
- }
290
- return array;
291
- }
292
296
  return main;
293
297
  }