我想从C++函数中的cubature包中调用C例程以执行多维集成。使用从Rcpp中的其他包的C函数
我试图重现基础研发的例子是
library(cubature)
integrand <- function(x) sin(x)
adaptIntegrate(integrand, 0, pi)
我可以称之为从RCPP该R功能以下this recipe from the gallery,但会有一些性能损失,转换从C/C来回++到R.从C++直接调用C函数似乎更明智。
C例程adapt_integrate
从cubature
出口与
// R_RegisterCCallable("cubature", "adapt_integrate", (DL_FUNC) adapt_integrate);
我不知道如何将它从C++调用然而,。这是我的跛脚尝试,
sourceCpp(code = '
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
double integrand(double x){
return(sin(x));
}
// [[Rcpp::depends(cubature)]]
// [[Rcpp::export]]
Rcpp::List integratecpp(double llim, double ulim)
{
Rcpp::Function p_cubature = R_GetCCallable("cubature", "adapt_integrate");
Rcpp::List result = p_cubature(integrand, llim, ulim);
return(result);
}
'
)
integratecpp(0, pi)
这不能编译;显然我正在做一些非常愚蠢的事情,并且错过了将R_GetCCallable
的输出转换为Rcpp::Function
(或直接调用它?)的一些重要步骤。我读过几篇涉及函数指针的相关文章,但还没有看到使用外部C函数的例子。
非常感谢组装这些缺失的部分。不幸的是,我将不得不重新思考这个问题,因为从我看到的'adapt_integrate'将不会轻易接受使用armadillo的数据结构定义的integrand。为了完整性,您能否添加一个最小的使用示例? – baptiste
它给你的是访问'cubature'注册的函数指针。我不知道你应该怎么处理C函数...... –
确实,[考虑使用示例](http://ab-initio.mit.edu/wiki/index.php/Cubature#例子)我看到麻烦了:'adapt_integrate_v'需要指向诸如'* fdata'之类的对象,被积函数期望指针如'* fval',而我真正想要传递的参数是eg 'arma :: colvec'对象。我认为我不能在两者之间架起一座桥梁。我可能必须坚持使用R级接口,或者在C++中实现我自己的2D正交。 – baptiste