Sto provando a chiamare una routine C dal pacchetto cubature in una funzione C++ per eseguire l'integrazione multidimensionale.utilizzando la funzione C da un altro pacchetto in Rcpp
L'esempio di base R Sto cercando di riprodurre è
library(cubature)
integrand <- function(x) sin(x)
adaptIntegrate(integrand, 0, pi)
ho potuto solo chiamare questa funzione R da Rcpp seguente this recipe from the gallery, ma ci sarebbe qualche penalizzazione delle prestazioni nel passaggio avanti e indietro da C/C++ a R. Sembra più sensato chiamare direttamente la funzione C da C++.
Il C di routine adapt_integrate
viene esportato da cubature
con
// R_RegisterCCallable("cubature", "adapt_integrate", (DL_FUNC) adapt_integrate);
Non capisco come chiamare da C++, tuttavia. Ecco il mio tentativo zoppo,
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)
Questo non riesce a compilare; chiaramente sto facendo qualcosa di molto sciocco e mi mancano alcuni passaggi importanti per convertire l'output di R_GetCCallable
in un Rcpp::Function
(o chiamarlo direttamente?). Ho letto diversi post correlati che trattano i puntatori di funzione, ma non ho visto un esempio utilizzando una funzione C esterna.
Mille grazie per aver assemblato questi pezzi mancanti. Dovrò ripensare il problema, sfortunatamente, perché da quello che vedo 'adapt_integrate' non accetterò facilmente un integrando che ho definito usando le strutture dati di armadillo. Per completezza, saresti in grado di aggiungere un minimo esempio di utilizzo? – baptiste
Quello che ti dà è l'accesso al puntatore alla funzione che 'cubature' ha registrato. Non so cosa dovresti fare con la funzione C ... –
anzi, [considerando un esempio di utilizzo] (http://ab-initio.mit.edu/wiki/index.php/Cubature# Esempio) Vedo problemi in avanti: 'adapt_integrate_v' si aspetta puntatori a oggetti come' * fdata', l'integrando si aspetta puntatori come '* fval', mentre gli argomenti che voglio veramente passare sono ad es. oggetti 'arma :: colvec'. Non penso che sarò in grado di fare un ponte tra i due. Potrei dover rimanere con l'interfaccia a livello R, o implementare la mia quadratura 2D in C++. – baptiste