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?

私の質問:の呼び出しごとに定数を渡すことなく、定数piを使用するにはどうすればよいですか?RcppEigenI.cpp

4

1 に答える 1

5

まず、grep for piin/usr/share/R/include/を実行すると、たとえば

  #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も実り多いものになる可能性があります。

于 2013-02-18T23:52:12.107 に答える