链接Rcpp与自适应大都市拒绝采样的C代码

时间:2016-06-03 03:22:37

标签: c++ c r rcpp

我想在我的Gibbs采样中使用自适应大都会拒绝采样(AMRS)。我可以直接使用R中的包HI并使用该算法。但是,由于我有太多参数,因此在R中的循环中逐个采样相当慢。所以我正在考虑在Rcpp中编写整个采样部分。问题是如何在Rcpp中使用AMRS功能。一种选择是找到一种在Rcpp中使用R函数的方法,但它会很慢。然后我在页面中找到了原始的C代码

[1]:AMRS http://www1.maths.leeds.ac.uk/~wally.gilks/adaptive.rejection/web_page/Welcome.html

所以问题就变成了如何将C代码与Rcpp集成。当我在搜索“在C ++中调用C”时,这些都是先编译C,然后是C ++,然后是链接。但是我不知道如何在Rcpp中这样做,因为编译发生在我使用SourceCpp时。任何人都可以给我一些建议如何实现?

1 个答案:

答案 0 :(得分:2)

查看HI如何实施C code in their package

具体来说,您应该实现自己的版本:

SEXP arms(SEXP bounds, SEXP myldens, SEXP yprev, SEXP size, SEXP rho);

这在https://github.com/cran/HI/blob/master/src/arms-R.c#L86-L172

中给出

在这种情况下,您应该选择将SEXP对象替换为适当的Rcpp数据类型:

/* bounds      : boundaries of the support of the density */
/* myldens     : R function to evaluate log density */
/* yprev       : previous value from markov chain */
/* size        : number of sampled values to be obtained */
/* rho         : R environment in which the logdensity is evaluated */

注意:实施应该是基于包的,而不是使用sourceCpp()