如果这个问题很天真,请道歉。 我可以使用C ++ Eigen中的指针变量在函数中成功返回多个值(int,double和bool变量)。但我不知道如何修改函数以在“RcppEigen.package.skeleton”中返回多个变量。 我可以使用“RcppEigen.package.skeleton”来安装包“RSS”,这样的C ++函数,它可以成功运行。
#include <Rcpp.h>
#include <RcppEigen.h>
using namespace Rcpp;
using namespace RcppEigen;
using namespace std;
using Eigen::MatrixXd;
RcppExport SEXP getRSS(SEXP X0, SEXP Y0){
MatrixXd X=Rcpp::as<MatrixXd>(X0);
MatrixXd Y=Rcpp::as<MatrixXd>(Y0);
MatrixXd RSS=((Y-X*((X.transpose()*X).inverse()*X.transpose()*Y)).transpose())*(Y-X*((X.transpose()*X).inverse()*X.transpose()*Y));
return wrap(RSS.determinant());
}
这是C ++函数,我想返回多个变量。我怎么能修改这个函数来使用“RcppEigen.package.skeleton”安装包。任何帮助将非常感激。
#include <Eigen/Dense>
#include <iostream>
#include <string>
using namespace std;
using namespace Eigen;
double getRSS(const MatrixXd& X, const MatrixXd& Y){
MatrixXd RSS=((Y-X*((X.transpose()*X).inverse()*X.transpose()*Y)).transpose())*(Y-X*((X.transpose()*X).inverse()*X.transpose()*Y));
return RSS.determinant();
}
void getPIcvalue(MatrixXd& Y, MatrixXd& Xf, MatrixXd& X0,double *keyV, int *keyP, bool *keyR){
bool valid;
double FitStat1;
FitStat1 = 1e+10;
int pointer;
double FitStat;
int n;
n=X0.rows();
MatrixXd X(n,X0.cols()+1);
for(int i=0;i<Xf.cols();i++){
X<<X0,Xf.col(i); //X: combine X0 and 1 column of Xf
FitStat=getRSS(X,Y); // calculate Residual Sum of Squares
valid=false;
if(FitStat<FitStat1){
FitStat1=FitStat; //get the minimum of FitStat
pointer=i; //get which column of Xf is the minimum of FitStat
valid=true;
}
}//for i
*keyV=FitStat1; //pointer return multiple variables
*keyP=FitStat1;
*keyR=FitStat1;
}