RcppbdSVD_lapack
C++ Function Reference
1 Signature
svdeig BigDataStatMeth::RcppbdSVD_lapack(T X, bool bcenter, bool bscale, bool complete)2 Parameters
X(T)bcenter(bool)bscale(bool)complete(bool)
3 Returns
Type: class T
4 Call Graph
5 Source Code
NoteImplementation
File: inst/include/hdf5Algebra/matrixSvdBlock.hpp • Lines 73-129
inline svdeig RcppbdSVD_lapack( T X, bool bcenter, bool bscale, bool complete ) {
svdeig retsvd;
char Schar='S';
char Achar='A';
int info = 0;
try {
if(bcenter == true || bscale == true) {
X = RcppNormalize_Data(X, bcenter, bscale, false);
}
int m = X.rows();
int n = X.cols();
int lda = std::max(1,m);
int ldu = std::max(1,m);
int ldvt = std::min(m, n);
int k = std::min(m,n);
int lwork;
if( complete == false ) {
lwork = 4*std::min(m,n)*std::min(m,n) + 7*std::min(m,n);
} else {
lwork = 4*std::min(m,n)*std::min(m,n) + 6*std::min(m,n) + std::max(m,n);
}
Eigen::VectorXd s = Eigen::VectorXd::Zero(k);
Eigen::VectorXd work = Eigen::VectorXd::Zero(lwork);
Eigen::VectorXi iwork(8*std::min(m,n));
Eigen::MatrixXd u;
Eigen::MatrixXd vt = Eigen::MatrixXd::Zero(ldvt,n);
if( complete == false ) {
u = Eigen::MatrixXd::Zero(ldu,k);
dgesdd_( &Schar, &m, &n, X.data(), &lda, s.data(), u.data(), &ldu, vt.data(), &ldvt, work.data(), &lwork, iwork.data(), &info);
} else {
u = Eigen::MatrixXd::Zero(ldu,m);
dgesdd_( &Achar, &m, &n, X.data(), &lda, s.data(), u.data(), &ldu, vt.data(), &ldvt, work.data(), &lwork, iwork.data(), &info);
}
retsvd.d = s;
retsvd.u = u;
retsvd.v = vt.transpose();
} catch(std::exception &ex) {
Rcpp::Rcout<< "C++ exception RcppbdSVD_lapack : "<< ex.what();
return retsvd;
} catch (...) {
Rf_error("C++ exception RcppbdSVD_lapack (unknown reason)");
return retsvd;
}
return retsvd;
}6 Usage Example
#include "BigDataStatMeth.hpp"
// Example usage
auto result = RcppbdSVD_lapack(...);