123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- #include <iostream>
- #include "EigValues.h"
- #define DEBUG_ARNOLDI
- using namespace NICE;
- using namespace std;
- void
- EVArnoldi::getEigenvalues ( const GenericMatrix & data, Vector & eigenvalues,
- Matrix & eigenvectors, uint k )
- {
- if ( data.rows () != data.cols () )
- {
- throw ( "EVArnoldi: matrix has to be quadratic" );
- }
- if ( k <= 0 )
- {
- throw ( "EVArnoldi: please use k>0." );
- }
- if ( verbose )
- cerr << "Initialize Matrices";
- uint n = data.cols ();
- NICE::Matrix rmatrix ( n, k, 0 );
- NICE::Matrix qmatrix ( n, k, 0 );
- eigenvalues.resize ( k );
- NICE::Vector q ( n );
- NICE::Vector r ( n );
- if ( verbose )
- cerr << "Random Initialization" << endl;
-
- for ( uint i = 0; i < k; i++ )
- for ( uint j = 0; j < n; j++ )
- #ifdef WIN32
- rmatrix (j, i) = double(rand())/RAND_MAX;
- #else
- rmatrix (j, i) = drand48 ();
- #endif
-
-
- double delta = 1.0;
- uint iteration = 0;
- while ( delta > mindelta && iteration < maxiterations )
- {
- NICE::Vector rold ( rmatrix.getColumn ( k - 1 ) );
-
-
- for ( uint reduceddim = 0; reduceddim < k; reduceddim++ )
- {
-
- q = rmatrix.getColumn ( reduceddim );
-
- q.normalizeL2 ();
-
- qmatrix.getColumnRef ( reduceddim ) = q;
-
-
- Vector currentCol = rmatrix.getColumnRef ( reduceddim );
-
- data.multiply ( currentCol, q );
-
- for ( uint j = 0; j < reduceddim; j++ )
- rmatrix.getColumnRef ( reduceddim ) -=
- qmatrix.getColumn ( j ) *
- ( qmatrix.getColumn ( j ).
- scalarProduct ( rmatrix.getColumn ( reduceddim ) ) );
- }
-
- NICE::Vector diff = rold - rmatrix.getColumn ( k - 1 );
- delta = diff.normL2 ();
- iteration++;
- if ( verbose )
- cerr << "EVArnoldi: [" << iteration << "] delta=" << delta << endl;
- }
- eigenvectors = rmatrix;
- for ( uint i = 0; i < k; i++ )
- {
- NICE::Vector tmp;
- eigenvectors.getColumnRef ( i ).normalizeL2 ();
- data.multiply ( tmp, eigenvectors.getColumn ( i ) );
- eigenvalues[i] = tmp.scalarProduct ( eigenvectors.getColumn ( i ) );
- }
- }
|