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

Function dependencies

6 Source Code

File: inst/include/hdf5Algebra/matrixEigenDecomposition.hppLines 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(...);