如何使用“RcppEigen.package.skeleton”在函数中返回多个值

时间:2014-11-03 03:27:55

标签: c++ r function pointers rcpp

如果这个问题很天真,请道歉。   我可以使用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;
}

0 个答案:

没有答案