3

我正在尝试在 C 中编写一个将由 R 调用的函数。在其中我需要随机抽样而不从向量中替换。Rmath.h 是否可以在 R 中使用类似 sample() 的东西?如果没有,有谁知道我为什么会得到

    Symbol not found: _gsl_rng_mt19937

当我尝试调用包含(使用适当的标头)的 dyn.load() 代码时:

      #include <gsl/gsl_randist.h>
      #include <gsl/gsl_rng.h>

     void update_infs (int *inds,
      int *inf_times,
      int *n,
      int *n_inf,
      int *locs,
      int *Rinds,
      double *logmean,
      double *logsd,
      double *alpha,
      double *wts,
      int *indices  /* a vector 1:n */
      ) { 
    ...

   /* set up GSL RNG */
   gsl_rng * rng = gsl_rng_alloc(gsl_rng_mt19937);
   /* end of GSL setup */
    ...
   gsl_ran_choose(rng, tmp_inf_me, Rinds[i], indices, *n, sizeof (double));
    ... }
4

2 回答 2

5

可能需要使用类似的命令编译共享对象

export PKG_CFLAGS=`gsl-config --cflags`
export PKG_LIBS=`gsl-config --libs`

进而

R CMD SHLIB gsl.c

或者

PKG_CFLAGS=`gsl-config --cflags` PKG_LIBS=`gsl-config --libs` R CMD SHLIB gsl.c

这告诉编译器在哪里寻找头文件,以及链接器在哪里找到要链接的库。在编译和链接期间,命令应包含 和 的输出,gsl-config --cflagsgsl-config --libs

gcc -std=gnu99 -I/home/mtmorgan/bin/R-devel/include -I/usr/local/include -I/usr/include -fpi -c gsl.c -o gsl.o

在编译和

gcc -std=gnu99 -shared -L/usr/local/lib64 -o gsl.so gsl.o -L/usr/lib -lgsl -lgslcblas -lm -L/home/mtmorgan/bin/R-devel/lib -lR

在链接期间。成功的考验是

R -e 'dyn.load("gsl.so")'

src/Makevars在一个包中会有一个文件

PKG_CFLAGS = `gsl-config --cflags`
PKG_LIBS = `gsl-config --libs`

并且,对于gsl-config可能不可用但用户已设法安装 gsl 并设置环境变量的 Windows LIB_GSL,一个文件src/Makevars.win

PKG_LIBS += -L$(LIB_GSL)$(R_ARCH)/lib -lgsl -lgslcblas -lm
PKG_CPPFLAGS += -I$(RHOME)/src/include -I$(LIB_GSL)$(R_ARCH)/include
于 2012-11-14T04:17:28.023 回答
0

在我忘记包含或共享库之前,我曾遇到过这些类型的“未找到符号”错误——这两者在 gsl 中都是必需的,即 gcc -I/usr/include/gsl foo.c -o foo -l: /usr/lib/libgsl.so。

PS,R(sample()或一些外部库)中可用的采样算法是否性能不够?我很惊讶这将成为除少数真正大数据项目外的所有项目的瓶颈......

于 2012-11-13T22:37:30.980 回答