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.