c++ - 将 Rcpp 与 C 代码链接起来以进行自适应大都会拒绝采样

标签 c++ c r rcpp

我想对我的 Gibbs 采样使用 Adaptive Metropolis 拒绝采样 (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 时发生的。任何人都可以给我一些建议如何实现这一目标?

最佳答案

查看如何 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()

关于c++ - 将 Rcpp 与 C 代码链接起来以进行自适应大都会拒绝采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37605426/

相关文章:

c++ - 多态性如何涉及多重继承?

c++ - OpenAL 2d 平移 C++

c++ - 我应该对 QSqlDatabase 使用单连接还是多连接

R: reshape 2 - colsplit 不适用于句号/句号

r - R中的非线性曲线拟合

c++ - 在函数中修改指向数组的指针

c - 一个 C 文件在 Linux 中调用并运行另一个 C 文件

c - "kill -15"触发 sigaction 代码但不终止我的 C 程序

java - 在 Java/C/C++ 中创建 MIPS 机器

r - Grep 变量并将结果存储在 R 中的向量中