spEigv#
Purpose#
Computes a specified number of eigenvalues and eigenvectors of a square, sparse matrix a.
Format#
- { va, ve } = spEigv(a, nev, which, tol, maxit, ncv)#
- Parameters:
a (sparse matrix) – NxN square, sparse matrix.
nev (scalar) – number of eigenvalues to compute.
which (string) – may be one of the following:
"LM"
largest magnitude,"LR"
largest real,"LI"
largest imaginary,"SR"
smallest real, or “SI” smallest imaginary. Default input 0, sets which to"LM"
.tol (scalar) – tolerance for eigenvalues. Default input 0, sets tol to 1e-15.
maxit (scalar) – maximum number of iterations. Default input 0, sets maxit to \(nev * (\text{columns of a}) * 100\).
ncv (scalar) – size of Arnoldi factorization. The minimum setting is the greater of \(nev+2\) and 20. See Remarks on how to set ncv. Default input 0, sets ncv to \(2 * (nev+1)\).
- Returns:
va (nevx1 dense vector) – containing the computed eigenvalues of input matrix a.
ve (Nxnev dense matrix) – containing the corresponding eigenvectors of input matrix a.
Examples#
// Set random seed
rndseed 3456;
// Declare sparse matrix a
sparse matrix a;
// Create random matrix x
x = 10*rndn(5, 5);
// Convert x to dense matrix
a = densetosp(x, 4);
21.276135 5.4078872 -19.817044 9.6771132 -19.211952
0.0000000 -4.4011007 10.445221 -5.1742289 -16.336474
a = 0.0000000 -20.853017 7.6285434 0.0000000 -15.626397
-12.637055 8.1227002 0.0000000 -8.7817892 0.0000000
0.0000000 -7.8181517 15.326816 0.0000000 0.0000000
/*
** This call is equivalent to calling
** { va, ve } = spEigv(a, 2,"LM", 1e-15, 2*5*100, 5);
*/
{ va, ve } = spEigv(a, 2, 0, 0, 0, 0);
va = 21.089832
-3.4769986 + 20.141970i
ve = -0.92097057 0.29490584 - 0.38519280i
-0.10091920 -0.18070330 - 0.38405816i
0.061241324 0.24121182 - 0.56419722i
0.36217049 0.017643612 + 0.26254313i
0.081917964 -0.31466284 - 0.19936942i
Below we show that the first eigenvalue times the corresponding eigenvector (1) equals the input matrix times the first eigenvector (2).
(1) va[1]*ve[.,1] = (2) a*ve[.,1] =
-19.423115 -19.423115
-2.1283690 -2.1283690
1.2915693 1.2915693
7.6381149 7.6381149
1.7276361 1.7276361
Remarks#
The ideal setting for input ncv is problem dependent and cannot be
easily predicted ahead of time. Increasing ncv will increase the amount
of memory used during computation. For a large, sparse matrix, ncv
should be small compared to the order of input matrix a. spEigv()
is not
thread-safe.
Technical Notes#
spEigv()
implements functions from the ARPACK library.