3

Rによって呼び出される関数をCで記述しようとしています。その中で、ベクトルから置換せずにランダムサンプルを取得する必要があります。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 --cflagsおよびの出力が次gsl-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 に答える