如何在RcppEigen中使用pi?

4

我对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?

我的问题是:如何在不传递的情况下在 RcppEigen 中使用常数 pi?不需要在每次调用 I.cpp 时都传递它。
1个回答

5
首先,在/usr/share/R/include/中搜索pi,您会找到例如:
  #define M_PI        3.141592653589793238462643383280    /* pi */

这里展示了使用Rcpp和RcppEigen的例子,其中涉及到R的使用。

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搜索也可能会有收获。

非常感谢。如果我用M_PI替换pi,它就可以工作了。(我猜我仍然没有完全理解我可以从Rcpp中访问什么,但显然这是没有特定包含语句的) - Henrik
1
使用M_PI是基本的C语言常量用法,大约在20世纪70年代末。关于“我从哪里获取pi值”的问题与Rcpp或RcppEigen无关。首先要做的事情是 :) - Dirk Eddelbuettel
1
但是我怎么知道在我的Rcpp会话中有哪些常量可用,或者更好的是,包含了哪些头文件? - Henrik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接