我想從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