ARPACK support
Submitted by Gael Guennebaud @ggael
Assigned to Nobody
Link to original bugzilla bug (#230)
Version: 3.0
Description
One way to get eigen decomposition on sparse matrices is to wrap ARPACK++, here is a start:
http://forum.kde.org/viewtopic.php?f=74&t=84238&p=192268#p192198
and here is a copy of schizofrenikh's message from the forum:
#include <arpack++/arssym.h>
#include <vector>
#include <eigen2/Eigen/Eigen>
class TMatrixForArpackpp {
private:
Eigen::SparseMatrix< double > &M;
public:
TMatrixForArpackpp( Eigen::SparseMatrix< double > &_M ) :
M(_M) {
;
};
void MultMv( double *v, double *w ) {
Eigen::Map< Eigen::VectorXd > v_map = Eigen::VectorXd::Map( v, M.rows() );
Eigen::Map< Eigen::VectorXd > w_map = Eigen::VectorXd::Map( w, M.cols() );
w_map = M.marked<Eigen::SelfAdjoint|Eigen::LowerTriangular>()*v_map;
}
};
void Lanczos_symm( Eigen::SparseMatrix< double > &M, std::vector< double > &eigenValues, std::vector< Eigen::VectorXd > &eigenVectors ) {
int n = M.cols();
TMatrixForArpackpp M_arp( M );
ARSymStdEig< double, TMatrixForArpackpp > prob( n, n-1, &M_arp, &TMatrixForArpackpp::MultMv, "SM" ); //"SM" to get smallest eigenvalues
prob.FindEigenvectors();
//prob.FindEigenvalues();
int m = prob.ConvergedEigenvalues();
eigenValues.resize(m);
eigenVectors.resize(m);
eigenValues.assign( prob.RawEigenvalues(), prob.RawEigenvalues()+m );
for( int i=0; i<m; i++ )
eigenVectors[i] = Eigen::VectorXd::Map( prob.RawEigenvector(i), n);
/*eigenValues = *( prob.StlEigenvalues() );
eigenVectors = *( prob.StlEigenvectors() );*/
}
To compile with arpack on my debian system I had to add -lblas -lgfortran -lgfortranbegin -lnsl -larpack -larpack++
Edited by Eigen Bugzilla