我可以将Eigen :: VectorXi转换为Eigen :: VectorXd吗?

时间:2012-11-19 15:01:46

标签: r eigen rcpp

我在R上使用RcppEigen 我想从R层采取双向量:

RcppExport SEXP testfunc (SEXP a) {
    const Eigen::Map<Eigen::VectorXd> vecD(as<Eigen::Map<Eigen::VectorXd> >(a));

但是,number是以整数形式出现的,所以我需要像这样得到整数:

RcppExport SEXP testfunc (SEXP a) {
    const Eigen::Map<Eigen::VectorXi> vecD(as<Eigen::Map<Eigen::VectorXi> >(a));

所以,我需要将它转换为double。我可以将Eigen :: VectorXi转换为Eigen :: VectorXd吗?

1 个答案:

答案 0 :(得分:2)

当您的意思是integer又名numeric或反之亦然时,您确定不会混淆来自R的double来电吗?没有理由没有两个函数,或者在函数内部发送。

例如,请考虑此处的代码(使用Rcpp 0.10.0功能)

#include <RcppEigen.h>

// [[Rcpp::depends(RcppEigen)]]

// [[Rcpp::export]]
double vecdSum(SEXP x) {
    const Eigen::Map<Eigen::VectorXd> 
       vec(Rcpp::as<Eigen::Map<Eigen::VectorXd> >(x));
    return vec.sum();
}

// [[Rcpp::export]]
int veciSum(SEXP x) {
    const Eigen::Map<Eigen::VectorXi> 
       vec(Rcpp::as<Eigen::Map<Eigen::VectorXi> >(x));
    return vec.sum();
}

我们可以通过

轻松使用
R> sourceCpp('/tmp/vecsums.cpp')    # Rcpp 0.10.0 adds this
R> veciSum(c(1L, 2L, 3L))
[1] 6
R> vecdSum(c(1, 2, 3))
[1] 6
R>