@danielsimonjr/mathts-matrix 0.1.12 → 0.1.13

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.
Binary file
@@ -1,3 +1,3 @@
1
1
  {
2
- "mathts-as.wasm": "sha384-IyFXb07px2TSL5Si1ZWfdJsjfHUPnsChMrlIyKqxfjkREfaF+4DHtBcuBkpqOhhx"
2
+ "mathts-as.wasm": "sha384-eSck1dw9Rtu8oUAQ/0GMpC1L4bhAPNVS72581QGAyd1xDlRvonQT/XA2RZjpxghB"
3
3
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danielsimonjr/mathts-matrix",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "Matrix operations for MathTS with WASM/WebGPU backend support",
5
5
  "author": "Daniel Simon Jr.",
6
6
  "license": "MIT",
@@ -1,607 +0,0 @@
1
- // src/operations/common.ts
2
- function eye(n) {
3
- return Array.from(
4
- { length: n },
5
- (_, i) => Array.from({ length: n }, (_2, j) => i === j ? 1 : 0)
6
- );
7
- }
8
- function cloneMatrix(A) {
9
- return A.map((row) => [...row]);
10
- }
11
- function transpose(A) {
12
- const m = A.length;
13
- const n = A[0].length;
14
- return Array.from({ length: n }, (_, j) => Array.from({ length: m }, (_2, i) => A[i][j]));
15
- }
16
- function isSymmetric(matrix, tolerance = 1e-10) {
17
- const n = matrix.length;
18
- if (n === 0) return true;
19
- if (matrix[0].length !== n) return false;
20
- for (let i = 0; i < n; i++) {
21
- for (let j = i + 1; j < n; j++) {
22
- if (Math.abs(matrix[i][j] - matrix[j][i]) > tolerance) {
23
- return false;
24
- }
25
- }
26
- }
27
- return true;
28
- }
29
- function matMul(A, B) {
30
- const m = A.length;
31
- const p = A[0].length;
32
- const n = B[0].length;
33
- const C = Array.from({ length: m }, () => new Array(n).fill(0));
34
- for (let i = 0; i < m; i++) {
35
- for (let k = 0; k < p; k++) {
36
- const aik = A[i][k];
37
- if (aik === 0) continue;
38
- for (let j = 0; j < n; j++) C[i][j] += aik * B[k][j];
39
- }
40
- }
41
- return C;
42
- }
43
- function matAdd(A, B) {
44
- const n = A.length;
45
- return Array.from(
46
- { length: n },
47
- (_, i) => Array.from({ length: n }, (_2, j) => A[i][j] + B[i][j])
48
- );
49
- }
50
- function matSub(A, B) {
51
- const n = A.length;
52
- return Array.from(
53
- { length: n },
54
- (_, i) => Array.from({ length: n }, (_2, j) => A[i][j] - B[i][j])
55
- );
56
- }
57
- function matScale(A, c) {
58
- return A.map((row) => row.map((v) => v * c));
59
- }
60
- function normInf(A) {
61
- let mx = 0;
62
- for (const row of A) for (const v of row) if (Math.abs(v) > mx) mx = Math.abs(v);
63
- return mx;
64
- }
65
- function norm1(A) {
66
- const m = A.length;
67
- const n = A[0].length;
68
- let maxColSum = 0;
69
- for (let j = 0; j < n; j++) {
70
- let colSum = 0;
71
- for (let i = 0; i < m; i++) colSum += Math.abs(A[i][j]);
72
- if (colSum > maxColSum) maxColSum = colSum;
73
- }
74
- return maxColSum;
75
- }
76
- function householder(x, degenerateBeta = -2) {
77
- const n = x.length;
78
- let sigma = 0;
79
- for (let i = 1; i < n; i++) {
80
- sigma += x[i] * x[i];
81
- }
82
- const v = [...x];
83
- v[0] = 1;
84
- if (sigma === 0 && x[0] >= 0) {
85
- return { v, beta: 0 };
86
- } else if (sigma === 0 && x[0] < 0) {
87
- return { v, beta: degenerateBeta };
88
- } else {
89
- const mu = Math.sqrt(x[0] * x[0] + sigma);
90
- if (x[0] <= 0) {
91
- v[0] = x[0] - mu;
92
- } else {
93
- v[0] = -sigma / (x[0] + mu);
94
- }
95
- const beta = 2 * v[0] * v[0] / (sigma + v[0] * v[0]);
96
- const v0 = v[0];
97
- for (let i = 0; i < n; i++) {
98
- v[i] /= v0;
99
- }
100
- return { v, beta };
101
- }
102
- }
103
- function applyHouseholderLeft(A, v, beta, startRow, startCol) {
104
- const n = A[0].length;
105
- const len = v.length;
106
- for (let j = startCol; j < n; j++) {
107
- let dot = 0;
108
- for (let i = 0; i < len; i++) {
109
- dot += v[i] * A[startRow + i][j];
110
- }
111
- dot *= beta;
112
- for (let i = 0; i < len; i++) {
113
- A[startRow + i][j] -= dot * v[i];
114
- }
115
- }
116
- }
117
- function applyHouseholderRight(A, v, beta, startRow, startCol) {
118
- const m = A.length;
119
- const len = v.length;
120
- for (let i = startRow; i < m; i++) {
121
- let dot = 0;
122
- for (let j = 0; j < len; j++) {
123
- dot += A[i][startCol + j] * v[j];
124
- }
125
- dot *= beta;
126
- for (let j = 0; j < len; j++) {
127
- A[i][startCol + j] -= dot * v[j];
128
- }
129
- }
130
- }
131
-
132
- // src/operations/eig.ts
133
- var EIG_GEN_EPS = 2220446049250313e-31;
134
- function cdiv(xr, xi, yr, yi) {
135
- let rr;
136
- let d;
137
- if (Math.abs(yr) > Math.abs(yi)) {
138
- rr = yi / yr;
139
- d = yr + rr * yi;
140
- return { r: (xr + rr * xi) / d, i: (xi - rr * xr) / d };
141
- } else {
142
- rr = yr / yi;
143
- d = yi + rr * yr;
144
- return { r: (rr * xr + xi) / d, i: (rr * xi - xr) / d };
145
- }
146
- }
147
- function orthesGeneral(H, V, ort, nn) {
148
- const low = 0;
149
- const high = nn - 1;
150
- for (let m = low + 1; m <= high - 1; m++) {
151
- let scale = 0;
152
- for (let i = m; i <= high; i++) {
153
- scale += Math.abs(H[i * nn + (m - 1)]);
154
- }
155
- if (scale !== 0) {
156
- let h = 0;
157
- for (let i = high; i >= m; i--) {
158
- ort[i] = H[i * nn + (m - 1)] / scale;
159
- h += ort[i] * ort[i];
160
- }
161
- let g = Math.sqrt(h);
162
- if (ort[m] > 0) g = -g;
163
- h = h - ort[m] * g;
164
- ort[m] = ort[m] - g;
165
- for (let j = m; j < nn; j++) {
166
- let f = 0;
167
- for (let i = high; i >= m; i--) f += ort[i] * H[i * nn + j];
168
- f = f / h;
169
- for (let i = m; i <= high; i++) H[i * nn + j] -= f * ort[i];
170
- }
171
- for (let i = 0; i <= high; i++) {
172
- let f = 0;
173
- for (let j = high; j >= m; j--) f += ort[j] * H[i * nn + j];
174
- f = f / h;
175
- for (let j = m; j <= high; j++) H[i * nn + j] -= f * ort[j];
176
- }
177
- ort[m] = scale * ort[m];
178
- H[m * nn + (m - 1)] = scale * g;
179
- }
180
- }
181
- for (let m = high - 1; m >= low + 1; m--) {
182
- if (H[m * nn + (m - 1)] !== 0) {
183
- for (let i = m + 1; i <= high; i++) ort[i] = H[i * nn + (m - 1)];
184
- for (let j = m; j <= high; j++) {
185
- let g = 0;
186
- for (let i = m; i <= high; i++) g += ort[i] * V[i * nn + j];
187
- g = g / ort[m] / H[m * nn + (m - 1)];
188
- for (let i = m; i <= high; i++) V[i * nn + j] += g * ort[i];
189
- }
190
- }
191
- }
192
- }
193
- function eigGeneral(A, computeVectors, symmetric) {
194
- const nn = A.length;
195
- const eps = EIG_GEN_EPS;
196
- const H = new Float64Array(nn * nn);
197
- for (let i = 0; i < nn; i++) {
198
- for (let j = 0; j < nn; j++) H[i * nn + j] = A[i][j];
199
- }
200
- const V = new Float64Array(nn * nn);
201
- for (let i = 0; i < nn; i++) V[i * nn + i] = 1;
202
- const d = new Float64Array(nn);
203
- const e = new Float64Array(nn);
204
- const ort = new Float64Array(nn);
205
- orthesGeneral(H, V, ort, nn);
206
- const low = 0;
207
- const high = nn - 1;
208
- let exshift = 0;
209
- let p = 0;
210
- let q = 0;
211
- let r = 0;
212
- let s = 0;
213
- let z = 0;
214
- let t;
215
- let w;
216
- let x;
217
- let y;
218
- let norm = 0;
219
- for (let i = 0; i < nn; i++) {
220
- for (let j = Math.max(i - 1, 0); j < nn; j++) {
221
- norm += Math.abs(H[i * nn + j]);
222
- }
223
- }
224
- let nIdx = nn - 1;
225
- let iter = 0;
226
- while (nIdx >= low) {
227
- let l = nIdx;
228
- while (l > low) {
229
- s = Math.abs(H[(l - 1) * nn + (l - 1)]) + Math.abs(H[l * nn + l]);
230
- if (s === 0) s = norm;
231
- if (Math.abs(H[l * nn + (l - 1)]) < eps * s) break;
232
- l--;
233
- }
234
- if (l === nIdx) {
235
- H[nIdx * nn + nIdx] = H[nIdx * nn + nIdx] + exshift;
236
- d[nIdx] = H[nIdx * nn + nIdx];
237
- e[nIdx] = 0;
238
- nIdx--;
239
- iter = 0;
240
- } else if (l === nIdx - 1) {
241
- w = H[nIdx * nn + (nIdx - 1)] * H[(nIdx - 1) * nn + nIdx];
242
- p = (H[(nIdx - 1) * nn + (nIdx - 1)] - H[nIdx * nn + nIdx]) / 2;
243
- q = p * p + w;
244
- z = Math.sqrt(Math.abs(q));
245
- H[nIdx * nn + nIdx] = H[nIdx * nn + nIdx] + exshift;
246
- H[(nIdx - 1) * nn + (nIdx - 1)] = H[(nIdx - 1) * nn + (nIdx - 1)] + exshift;
247
- x = H[nIdx * nn + nIdx];
248
- if (q >= 0) {
249
- z = p >= 0 ? p + z : p - z;
250
- d[nIdx - 1] = x + z;
251
- d[nIdx] = d[nIdx - 1];
252
- if (z !== 0) d[nIdx] = x - w / z;
253
- e[nIdx - 1] = 0;
254
- e[nIdx] = 0;
255
- x = H[nIdx * nn + (nIdx - 1)];
256
- s = Math.abs(x) + Math.abs(z);
257
- p = x / s;
258
- q = z / s;
259
- r = Math.sqrt(p * p + q * q);
260
- p = p / r;
261
- q = q / r;
262
- for (let j = nIdx - 1; j < nn; j++) {
263
- z = H[(nIdx - 1) * nn + j];
264
- H[(nIdx - 1) * nn + j] = q * z + p * H[nIdx * nn + j];
265
- H[nIdx * nn + j] = q * H[nIdx * nn + j] - p * z;
266
- }
267
- for (let i = 0; i <= nIdx; i++) {
268
- z = H[i * nn + (nIdx - 1)];
269
- H[i * nn + (nIdx - 1)] = q * z + p * H[i * nn + nIdx];
270
- H[i * nn + nIdx] = q * H[i * nn + nIdx] - p * z;
271
- }
272
- for (let i = low; i <= high; i++) {
273
- z = V[i * nn + (nIdx - 1)];
274
- V[i * nn + (nIdx - 1)] = q * z + p * V[i * nn + nIdx];
275
- V[i * nn + nIdx] = q * V[i * nn + nIdx] - p * z;
276
- }
277
- } else {
278
- d[nIdx - 1] = x + p;
279
- d[nIdx] = x + p;
280
- e[nIdx - 1] = z;
281
- e[nIdx] = -z;
282
- }
283
- nIdx = nIdx - 2;
284
- iter = 0;
285
- } else {
286
- x = H[nIdx * nn + nIdx];
287
- y = 0;
288
- w = 0;
289
- if (l < nIdx) {
290
- y = H[(nIdx - 1) * nn + (nIdx - 1)];
291
- w = H[nIdx * nn + (nIdx - 1)] * H[(nIdx - 1) * nn + nIdx];
292
- }
293
- if (iter === 10) {
294
- exshift += x;
295
- for (let i = low; i <= nIdx; i++) H[i * nn + i] -= x;
296
- s = Math.abs(H[nIdx * nn + (nIdx - 1)]) + Math.abs(H[(nIdx - 1) * nn + (nIdx - 2)]);
297
- x = y = 0.75 * s;
298
- w = -0.4375 * s * s;
299
- }
300
- if (iter === 30) {
301
- s = (y - x) / 2;
302
- s = s * s + w;
303
- if (s > 0) {
304
- s = Math.sqrt(s);
305
- if (y < x) s = -s;
306
- s = x - w / ((y - x) / 2 + s);
307
- for (let i = low; i <= nIdx; i++) H[i * nn + i] -= s;
308
- exshift += s;
309
- x = y = w = 0.964;
310
- }
311
- }
312
- iter = iter + 1;
313
- let m = nIdx - 2;
314
- while (m >= l) {
315
- z = H[m * nn + m];
316
- r = x - z;
317
- s = y - z;
318
- p = (r * s - w) / H[(m + 1) * nn + m] + H[m * nn + (m + 1)];
319
- q = H[(m + 1) * nn + (m + 1)] - z - r - s;
320
- r = H[(m + 2) * nn + (m + 1)];
321
- s = Math.abs(p) + Math.abs(q) + Math.abs(r);
322
- p = p / s;
323
- q = q / s;
324
- r = r / s;
325
- if (m === l) break;
326
- if (Math.abs(H[m * nn + (m - 1)]) * (Math.abs(q) + Math.abs(r)) < eps * (Math.abs(p) * (Math.abs(H[(m - 1) * nn + (m - 1)]) + Math.abs(z) + Math.abs(H[(m + 1) * nn + (m + 1)])))) {
327
- break;
328
- }
329
- m--;
330
- }
331
- for (let i = m + 2; i <= nIdx; i++) {
332
- H[i * nn + (i - 2)] = 0;
333
- if (i > m + 2) H[i * nn + (i - 3)] = 0;
334
- }
335
- for (let k = m; k <= nIdx - 1; k++) {
336
- const notlast = k !== nIdx - 1;
337
- if (k !== m) {
338
- p = H[k * nn + (k - 1)];
339
- q = H[(k + 1) * nn + (k - 1)];
340
- r = notlast ? H[(k + 2) * nn + (k - 1)] : 0;
341
- x = Math.abs(p) + Math.abs(q) + Math.abs(r);
342
- if (x !== 0) {
343
- p = p / x;
344
- q = q / x;
345
- r = r / x;
346
- }
347
- }
348
- if (x === 0) break;
349
- s = Math.sqrt(p * p + q * q + r * r);
350
- if (p < 0) s = -s;
351
- if (s !== 0) {
352
- if (k !== m) {
353
- H[k * nn + (k - 1)] = -s * x;
354
- } else if (l !== m) {
355
- H[k * nn + (k - 1)] = -H[k * nn + (k - 1)];
356
- }
357
- p = p + s;
358
- x = p / s;
359
- y = q / s;
360
- z = r / s;
361
- q = q / p;
362
- r = r / p;
363
- for (let j = k; j < nn; j++) {
364
- p = H[k * nn + j] + q * H[(k + 1) * nn + j];
365
- if (notlast) {
366
- p = p + r * H[(k + 2) * nn + j];
367
- H[(k + 2) * nn + j] = H[(k + 2) * nn + j] - p * z;
368
- }
369
- H[k * nn + j] = H[k * nn + j] - p * x;
370
- H[(k + 1) * nn + j] = H[(k + 1) * nn + j] - p * y;
371
- }
372
- const colEnd = Math.min(nIdx, k + 3);
373
- for (let i = 0; i <= colEnd; i++) {
374
- p = x * H[i * nn + k] + y * H[i * nn + (k + 1)];
375
- if (notlast) {
376
- p = p + z * H[i * nn + (k + 2)];
377
- H[i * nn + (k + 2)] = H[i * nn + (k + 2)] - p * r;
378
- }
379
- H[i * nn + k] = H[i * nn + k] - p;
380
- H[i * nn + (k + 1)] = H[i * nn + (k + 1)] - p * q;
381
- }
382
- for (let i = low; i <= high; i++) {
383
- p = x * V[i * nn + k] + y * V[i * nn + (k + 1)];
384
- if (notlast) {
385
- p = p + z * V[i * nn + (k + 2)];
386
- V[i * nn + (k + 2)] = V[i * nn + (k + 2)] - p * r;
387
- }
388
- V[i * nn + k] = V[i * nn + k] - p;
389
- V[i * nn + (k + 1)] = V[i * nn + (k + 1)] - p * q;
390
- }
391
- }
392
- }
393
- }
394
- }
395
- if (norm !== 0) {
396
- for (nIdx = nn - 1; nIdx >= 0; nIdx--) {
397
- p = d[nIdx];
398
- q = e[nIdx];
399
- if (q === 0) {
400
- let l = nIdx;
401
- H[nIdx * nn + nIdx] = 1;
402
- for (let i = nIdx - 1; i >= 0; i--) {
403
- w = H[i * nn + i] - p;
404
- r = 0;
405
- for (let j = l; j <= nIdx; j++) r += H[i * nn + j] * H[j * nn + nIdx];
406
- if (e[i] < 0) {
407
- z = w;
408
- s = r;
409
- } else {
410
- l = i;
411
- if (e[i] === 0) {
412
- H[i * nn + nIdx] = w !== 0 ? -r / w : -r / (eps * norm);
413
- } else {
414
- x = H[i * nn + (i + 1)];
415
- y = H[(i + 1) * nn + i];
416
- q = (d[i] - p) * (d[i] - p) + e[i] * e[i];
417
- t = (x * s - z * r) / q;
418
- H[i * nn + nIdx] = t;
419
- if (Math.abs(x) > Math.abs(z)) {
420
- H[(i + 1) * nn + nIdx] = (-r - w * t) / x;
421
- } else {
422
- H[(i + 1) * nn + nIdx] = (-s - y * t) / z;
423
- }
424
- }
425
- t = Math.abs(H[i * nn + nIdx]);
426
- if (eps * t * t > 1) {
427
- for (let j = i; j <= nIdx; j++) H[j * nn + nIdx] = H[j * nn + nIdx] / t;
428
- }
429
- }
430
- }
431
- } else if (q < 0) {
432
- let l = nIdx - 1;
433
- if (Math.abs(H[nIdx * nn + (nIdx - 1)]) > Math.abs(H[(nIdx - 1) * nn + nIdx])) {
434
- H[(nIdx - 1) * nn + (nIdx - 1)] = q / H[nIdx * nn + (nIdx - 1)];
435
- H[(nIdx - 1) * nn + nIdx] = -(H[nIdx * nn + nIdx] - p) / H[nIdx * nn + (nIdx - 1)];
436
- } else {
437
- const cd = cdiv(0, -H[(nIdx - 1) * nn + nIdx], H[(nIdx - 1) * nn + (nIdx - 1)] - p, q);
438
- H[(nIdx - 1) * nn + (nIdx - 1)] = cd.r;
439
- H[(nIdx - 1) * nn + nIdx] = cd.i;
440
- }
441
- H[nIdx * nn + (nIdx - 1)] = 0;
442
- H[nIdx * nn + nIdx] = 1;
443
- for (let i = nIdx - 2; i >= 0; i--) {
444
- let ra = 0;
445
- let sa = 0;
446
- for (let j = l; j <= nIdx; j++) {
447
- ra += H[i * nn + j] * H[j * nn + (nIdx - 1)];
448
- sa += H[i * nn + j] * H[j * nn + nIdx];
449
- }
450
- w = H[i * nn + i] - p;
451
- if (e[i] < 0) {
452
- z = w;
453
- r = ra;
454
- s = sa;
455
- } else {
456
- l = i;
457
- if (e[i] === 0) {
458
- const cd = cdiv(-ra, -sa, w, q);
459
- H[i * nn + (nIdx - 1)] = cd.r;
460
- H[i * nn + nIdx] = cd.i;
461
- } else {
462
- x = H[i * nn + (i + 1)];
463
- y = H[(i + 1) * nn + i];
464
- let vr = (d[i] - p) * (d[i] - p) + e[i] * e[i] - q * q;
465
- const vi = (d[i] - p) * 2 * q;
466
- if (vr === 0 && vi === 0) {
467
- vr = eps * norm * (Math.abs(w) + Math.abs(q) + Math.abs(x) + Math.abs(y) + Math.abs(z));
468
- }
469
- const cd = cdiv(x * r - z * ra + q * sa, x * s - z * sa - q * ra, vr, vi);
470
- H[i * nn + (nIdx - 1)] = cd.r;
471
- H[i * nn + nIdx] = cd.i;
472
- if (Math.abs(x) > Math.abs(z) + Math.abs(q)) {
473
- H[(i + 1) * nn + (nIdx - 1)] = (-ra - w * H[i * nn + (nIdx - 1)] + q * H[i * nn + nIdx]) / x;
474
- H[(i + 1) * nn + nIdx] = (-sa - w * H[i * nn + nIdx] - q * H[i * nn + (nIdx - 1)]) / x;
475
- } else {
476
- const cd2 = cdiv(
477
- -r - y * H[i * nn + (nIdx - 1)],
478
- -s - y * H[i * nn + nIdx],
479
- z,
480
- q
481
- );
482
- H[(i + 1) * nn + (nIdx - 1)] = cd2.r;
483
- H[(i + 1) * nn + nIdx] = cd2.i;
484
- }
485
- }
486
- t = Math.max(Math.abs(H[i * nn + (nIdx - 1)]), Math.abs(H[i * nn + nIdx]));
487
- if (eps * t * t > 1) {
488
- for (let j = i; j <= nIdx; j++) {
489
- H[j * nn + (nIdx - 1)] = H[j * nn + (nIdx - 1)] / t;
490
- H[j * nn + nIdx] = H[j * nn + nIdx] / t;
491
- }
492
- }
493
- }
494
- }
495
- }
496
- }
497
- for (let j = nn - 1; j >= low; j--) {
498
- for (let i = low; i <= high; i++) {
499
- z = 0;
500
- const kEnd = Math.min(j, high);
501
- for (let k = low; k <= kEnd; k++) z += V[i * nn + k] * H[k * nn + j];
502
- V[i * nn + j] = z;
503
- }
504
- }
505
- }
506
- const values = [];
507
- for (let j = 0; j < nn; j++) values.push({ re: d[j], im: e[j] });
508
- let vectors;
509
- if (computeVectors) {
510
- vectors = [];
511
- for (let j = 0; j < nn; j++) {
512
- const vec = new Array(nn).fill(0);
513
- if (e[j] === 0) {
514
- let colNorm = 0;
515
- for (let i = 0; i < nn; i++) colNorm += V[i * nn + j] * V[i * nn + j];
516
- colNorm = Math.sqrt(colNorm);
517
- if (colNorm > 1e-300) {
518
- for (let i = 0; i < nn; i++) vec[i] = V[i * nn + j] / colNorm;
519
- } else {
520
- for (let i = 0; i < nn; i++) vec[i] = V[i * nn + j];
521
- }
522
- }
523
- vectors.push(vec);
524
- }
525
- } else {
526
- vectors = eye(nn);
527
- }
528
- return { values, vectors, isSymmetric: symmetric };
529
- }
530
- function eig(matrix, options = {}) {
531
- const { computeVectors = true } = options;
532
- let A;
533
- if (matrix instanceof Float64Array) {
534
- const n2 = Math.sqrt(matrix.length);
535
- if (n2 !== Math.floor(n2)) {
536
- throw new Error("Float64Array length must be a perfect square");
537
- }
538
- A = Array.from({ length: n2 }, (_, i) => Array.from({ length: n2 }, (_2, j) => matrix[i * n2 + j]));
539
- } else {
540
- A = matrix;
541
- }
542
- const n = A.length;
543
- if (n === 0) {
544
- return { values: [], vectors: [], isSymmetric: true };
545
- }
546
- for (let i = 0; i < n; i++) {
547
- if (A[i].length !== n) {
548
- throw new Error("Matrix must be square");
549
- }
550
- }
551
- const symmetric = isSymmetric(A);
552
- if (n === 1) {
553
- return {
554
- values: [{ re: A[0][0], im: 0 }],
555
- vectors: [[1]],
556
- isSymmetric: symmetric
557
- };
558
- }
559
- return eigGeneral(A, computeVectors, symmetric);
560
- }
561
- function eigvals(matrix, options) {
562
- return eig(matrix, { ...options, computeVectors: false }).values;
563
- }
564
- function powerIteration(matrix, options = {}) {
565
- const { maxIterations = 1e3, tolerance = 1e-12 } = options;
566
- const n = matrix.length;
567
- let v = Array.from({ length: n }, () => Math.random() - 0.5);
568
- let norm = Math.sqrt(v.reduce((sum, x) => sum + x * x, 0));
569
- v = v.map((x) => x / norm);
570
- let eigenvalue = 0;
571
- let prevEigenvalue = 0;
572
- for (let iter = 0; iter < maxIterations; iter++) {
573
- const w = new Array(n).fill(0);
574
- for (let i = 0; i < n; i++) {
575
- for (let j = 0; j < n; j++) {
576
- w[i] += matrix[i][j] * v[j];
577
- }
578
- }
579
- eigenvalue = v.reduce((sum, vi, i) => sum + vi * w[i], 0);
580
- norm = Math.sqrt(w.reduce((sum, x) => sum + x * x, 0));
581
- v = w.map((x) => x / norm);
582
- if (Math.abs(eigenvalue - prevEigenvalue) < tolerance * Math.abs(eigenvalue)) {
583
- break;
584
- }
585
- prevEigenvalue = eigenvalue;
586
- }
587
- return { value: eigenvalue, vector: v };
588
- }
589
-
590
- export {
591
- eye,
592
- cloneMatrix,
593
- transpose,
594
- isSymmetric,
595
- matMul,
596
- matAdd,
597
- matSub,
598
- matScale,
599
- normInf,
600
- norm1,
601
- householder,
602
- applyHouseholderLeft,
603
- applyHouseholderRight,
604
- eig,
605
- eigvals,
606
- powerIteration
607
- };
@@ -1,11 +0,0 @@
1
- import {
2
- eig,
3
- eigvals,
4
- powerIteration
5
- } from "./chunk-JRSQE7LB.js";
6
- import "./chunk-4VMDO6W2.js";
7
- export {
8
- eig,
9
- eigvals,
10
- powerIteration
11
- };