1
1
import numpy as np
2
- def lanczos (A : np .ndarray ) -> ([ float ], [float ]) :
2
+ def lanczos (a : np .ndarray ) -> tuple [ list [ float ], list [float ]] :
3
3
"""
4
4
Implements the Lanczos algorithm for a symmetric matrix.
5
5
@@ -15,20 +15,21 @@ def lanczos(A: np.ndarray) -> ([float], [float]):
15
15
beta : [float]
16
16
List of off-diagonal elements of the resulting tridiagonal matrix.
17
17
"""
18
- n = A .shape [0 ]
19
- V = np .zeros ((n , n ))
20
- V [:, 0 ] = np .random .randn (n )
21
- V [:, 0 ] /= np .linalg .norm (V [:, 0 ])
22
- alpha = []
23
- beta = []
18
+ n = a .shape [0 ]
19
+ v = np .zeros ((n , n ))
20
+ rng = np .random .default_rng ()
21
+ v [:, 0 ] = rng .standard_normal (n )
22
+ v [:, 0 ] /= np .linalg .norm (v [:, 0 ])
23
+ alpha : list [float ] = []
24
+ beta : list [float ] = []
24
25
for j in range (n ):
25
- w = np .dot (A , V [:, j ])
26
- alpha .append (np .dot (w , V [:, j ]))
26
+ w = np .dot (a , v [:, j ])
27
+ alpha .append (np .dot (w , v [:, j ]))
27
28
if j == n - 1 :
28
29
break
29
- w -= alpha [j ] * V [:, j ]
30
+ w -= alpha [j ] * v [:, j ]
30
31
if j > 0 :
31
- w -= beta [j - 1 ] * V [:, j - 1 ]
32
+ w -= beta [j - 1 ] * v [:, j - 1 ]
32
33
beta .append (np .linalg .norm (w ))
33
- V [:, j + 1 ] = w / beta [j ]
34
+ v [:, j + 1 ] = w / beta [j ]
34
35
return alpha , beta
0 commit comments