RcppbdEigen_spectra
C++ Function Reference
1 Signature
eigdecomp BigDataStatMeth::RcppbdEigen_spectra(const Eigen::MatrixXd &X, int k, const std::string &which="LM", int ncv=0, bool bcenter=false, bool bscale=false, double tol=1e-10, int max_iter=1000)2 Description
Eigenvalue decomposition using Spectra (partial, k < n)
3 Parameters
X(const Eigen::MatrixXd &)k(int)which(const std::string &)ncv(int)bcenter(bool)bscale(bool)tol(double)max_iter(int)
4 Returns
Type: eigdecomp
5 Call Graph
6 Source Code
NoteImplementation
File: inst/include/hdf5Algebra/matrixEigenDecomposition.hpp • Lines 122-178
inline eigdecomp RcppbdEigen_spectra(const Eigen::MatrixXd& X, int k,
const std::string& which = "LM",
int ncv = 0,
bool bcenter = false, bool bscale = false,
double tol = 1e-10, int max_iter = 1000)
{
eigdecomp reteig;
Eigen::MatrixXd nX;
try {
int n = X.rows();
if (X.rows() != X.cols())
throw std::runtime_error("Matrix must be square for eigendecomposition");
std::tie(k, ncv) = validateSpectraParams(n, k, ncv);
reteig.is_symmetric = isMatrixSymmetric(X);
if (reteig.is_symmetric) {
Eigen::MatrixXd Xcp = (bcenter || bscale)
? RcppNormalize_Data(X, bcenter, bscale, false) : X;
Spectra::DenseSymMatProd<double> op(Xcp);
Spectra::SymEigsSolver<Spectra::DenseSymMatProd<double>> eigs(op, k, ncv);
eigs.init();
(void)eigs.compute(getSymmetricSortRule(which), max_iter, tol);
if (eigs.info() == Spectra::CompInfo::Successful) {
reteig.eigenvalues_real = eigs.eigenvalues();
reteig.eigenvalues_imag = Eigen::VectorXd::Zero(k);
reteig.eigenvectors_real = eigs.eigenvectors();
reteig.eigenvectors_imag = Eigen::MatrixXd::Zero(n, k);
reteig.bconv = true;
}
} else {
Eigen::MatrixXd Xcp = (bcenter || bscale)
? RcppNormalize_Data(X, bcenter, bscale, false) : X;
Spectra::DenseGenMatProd<double> op(Xcp);
Spectra::GenEigsSolver<Spectra::DenseGenMatProd<double>> eigs(op, k, ncv);
eigs.init();
(void)eigs.compute(getGeneralSortRule(which), max_iter, tol);
if (eigs.info() == Spectra::CompInfo::Successful) {
Eigen::VectorXcd ev = eigs.eigenvalues();
Eigen::MatrixXcd evec = eigs.eigenvectors();
reteig.eigenvalues_real = ev.real();
reteig.eigenvalues_imag = ev.imag();
reteig.eigenvectors_real = evec.real();
reteig.eigenvectors_imag = evec.imag();
reteig.bconv = true;
}
}
reteig.bcomputevectors = true;
} catch(std::exception &ex) {
throw std::runtime_error(std::string("C++ exception RcppbdEigen_spectra: ") + ex.what());
} catch (...) {
throw std::runtime_error("C++ exception RcppbdEigen_spectra (unknown reason)");
}
return reteig;
}7 Usage Example
#include "BigDataStatMeth.hpp"
// Example usage
auto result = RcppbdEigen_spectra(...);