如何用RcppGSL定义一系列函数?

时间:2015-01-05 21:23:46

标签: c++ r rcpp

我想做一个二维样条插值。由于GSL库没有准备好使用的多维函数,我想我可以使用两步插值。也就是说,我沿着第一维插值以第二维的值网格为条件,然后沿第二维插值。在R中,我可以轻松创建一个可以桥接这两个步骤的样条函数列表。例如,我有一个xy的向量,以及z = f(x,y)的相应矩阵。现在,我希望以f(x0,y0)x0的值插入y0

x <- 1:10
y <- 3:8
z <- matrix(rnorm(length(x)*length(y)), length(x), length(y))
x0 <- 2.2; y0 <- 4.5

# Create a sequence of spline functions conditional on y
spl.list <- vector("list", length(y))
for(i in 1:length(y)){
    spl.list[[i]] <- splinefun(x, z[,i], "natural")
}
# The function values at (x0, y).
intp1 <- sapply(1:length(y), function(i) spl.list[[i]](x0) )
# Create the spline function along y.
intp2.spl <- splinefun(y, intp1, "natural")
intp2.spl(y0)

我正在尝试用RcppGSL实现类似的目标。我正在使用GSL的gsl_spline。然而,问题是我不知道RcppGSL中可以存储一系列函数的任何东西,例如上面R代码中的spl.list之类的东西。我试过List,但显然不是正确的事。下面的代码是我在RcppGSL中的单变量插值函数。

src <- '
#include <RcppGSL.h>
#include <gsl/gsl_spline.h>
using namespace Rcpp;
// [[Rcpp::depends(RcppGSL)]]

// [[Rcpp::export]]
double my_fn(NumericVector x, NumericVector y, double x0){
    int nx = x.length();
    gsl_interp_accel *accP  = gsl_interp_accel_alloc();
    gsl_spline *spline  = gsl_spline_alloc( gsl_interp_cspline , nx );
    gsl_spline_init( spline, x.begin(), y.begin(), nx);

    double out = gsl_spline_eval(spline, x0, accP);
    gsl_interp_accel_free (accP);
    gsl_spline_free (spline);
    return(out);
}
'
sourceCpp(code = src)

有人想过如何在RcppGSL中创建一系列函数吗?或者用RcppGSL获得二维样条插值的其他替代方法?

0 个答案:

没有答案