如何在RcppEigen中使用pi?

时间:2013-02-18 23:49:06

标签: r rcpp pi

我是Rcpp的新手,或者更具体地说是RcppEigen,并且在我的代码中如何使用pi作为常量而苦恼。代码在MCMC算法中运行了很多次,因此任何速度提升都是完美的。目前,我每次调用该函数时都会将pi移交,如下面的代码所示:

require(RcppEigen)
require(inline)

I.Cpp <- "
using Eigen::Map;
using Eigen::MatrixXd;
using Eigen::VectorXd;
using Rcpp::NumericVector;

const Map<MatrixXd> delta(as<Map<MatrixXd> >(delta0));
const Map<VectorXd> d(as<Map<VectorXd> >(DD));
const Rcpp::NumericVector tpi(pie);
double pi = tpi[0];

const MatrixXd I = delta.transpose() * d.asDiagonal() * pi * pi;
return wrap(I);
"

I.cpp <- cxxfunction(signature(delta0 = "matrix", DD = "numeric", pie = "numeric"), I.Cpp, plugin = "RcppEigen")


delta0 <- matrix(rnorm(25), 5)
DD <- rnorm(5)

I.cpp(delta0, DD, pi) # this piece of code gets called multiple times?

我的问题:我如何在pi内使用常量RcppEigen,而不是在I.cpp的每次调用都将其传递过来?

1 个答案:

答案 0 :(得分:4)

首先,在pi中找到/usr/share/R/include/的grep并找到例如

  #define M_PI        3.141592653589793238462643383280    /* pi */

这样你就可以使用R,例如这里有Rcpp和RcppEigen。

示例:

R> getpi <- cppFunction('double twopi() { return M_PI; } ')
R> getpi()
[1] 3.142
R> print(getpi(), digits=20)
[1] 3.141592653589793116
R> 

我确信这也在数学标题中。 [去检查:是的,从math.h开始。 ]可能多次。通过其他渠道进行Grep'ing也很有成效。