latest version v1.9 - last update 10 Apr 2010 |
A fast LAPACK-based method for computation of (some) eigenvector and eigenvalues. More...
#include <ltiFastEigenSystem.h>
Classes | |
class | parameters |
eigenSystem parameter class More... | |
Public Member Functions | |
fastEigenSystem () | |
fastEigenSystem (const parameters &theParams) | |
fastEigenSystem (const int dimensions) | |
virtual | ~fastEigenSystem () |
const parameters & | getParameters () const |
virtual functor * | clone () const |
virtual bool | apply (const matrix< T > &theMatrix, vector< T > &eigenvalues, matrix< T > &eigenvectors) const |
virtual const char * | getTypeName () const |
A fast LAPACK-based method for computation of (some) eigenvector and eigenvalues.
Depending on the parameters useRRR (relatively robust representation), either xSYEVR (true) or xSYEVX (false) are used. The latter is default since RRR goes into infinite loops for some data. Note however that switching useRRR to true is usually much faster (a simple test yielded 25% speed-up).
Part of the man page of xSYEVR:
DSYEVR (SSYEVR) computes selected eigenvalues and, optionally, eigenvectors of a real symmetric tridiagonal matrix T. Eigenvalues and eigenvectors can be selected by specifying either a range of values or a range of indices for the desired eigenvalues.
Whenever possible, DSYEVR calls DSTEGR to compute the eigenspectrum using Relatively Robust Representations. DSTEGR computes eigenvalues by the dqds algorithm, while orthogonal eigenvectors are com puted from various "good" L D L^T representations (also known as Relatively Robust Representations). Gram-Schmidt orthogonalization is avoided as far as possible. More specifically, the various steps of the algorithm are as fol lows. For the i-th unreduced block of T,
(a) Compute T - sigma_i = L_i D_i L_i^T, such that L_i D_i L_i^T is a relatively robust representation,
(b) Compute the eigenvalues, lambda_j, of L_i D_i L_i^T to high relative accuracy by the dqds algorithm,
(c) If there is a cluster of close eigenvalues, "choose" sigma_i close to the cluster, and go to step (a),
(d) Given the approximate eigenvalue lambda_j of L_i D_i L_i^T, compute the corresponding eigenvector by forming a rank-revealing twisted factorization.
The desired accuracy of the output can be specified by the input parameter ABSTOL.
For more details, see "A new O(n^2) algorithm for the symmetric tridiagonal eigenvalue/eigenvector problem", by Inderjit Dhillon, Computer Science Division Technical Report No. UCB//CSD-97-971, UC Berkeley, May 1997.
Part of the man page of xSYEVX:
SSYEVX computes selected eigenvalues and, optionally, eigenvectors of a real symmetric matrix A. Eigenvalues and eigenvectors can be selected by specifying either a range of values or a range of indices for the desired eigenvalues.
lti::fastEigenSystem< T >::fastEigenSystem | ( | ) |
default constructor
lti::fastEigenSystem< T >::fastEigenSystem | ( | const parameters & | theParams | ) |
constructor, sets the parameters
lti::fastEigenSystem< T >::fastEigenSystem | ( | const int | dimensions | ) |
constructor, sets the parameters
virtual lti::fastEigenSystem< T >::~fastEigenSystem | ( | ) | [virtual] |
destructor
virtual bool lti::fastEigenSystem< T >::apply | ( | const matrix< T > & | theMatrix, | |
vector< T > & | eigenvalues, | |||
matrix< T > & | eigenvectors | |||
) | const [virtual] |
Computes eigenvalues and eigenvectors of the given matrix.
The functor can efficiently calculate only a few dimensions of the eigenspace, taking those with the largest eigenvalues. The number of dimensions is set with parameters::dimensions.
theMatrix | matrix whose eigenvectors are to be computed | |
eigenvalues | elements will contain the eigenvalues | |
eigenvectors | columns will contain the eigenvectors corresponding to the eigenvalues |
Implements lti::eigenSystem< T >.
virtual functor* lti::fastEigenSystem< T >::clone | ( | ) | const [virtual] |
clone this functor
Implements lti::functor.
const parameters& lti::fastEigenSystem< T >::getParameters | ( | ) | const |
returns the current parameters.
Reimplemented from lti::eigenSystem< T >.
virtual const char* lti::fastEigenSystem< T >::getTypeName | ( | void | ) | const [inline, virtual] |
returns the name of this type
Reimplemented from lti::eigenSystem< T >.