1

私はしばらくの間、GSL の関数を使用して MCMC を実行する C で書いているプログラムに取り組んできました。私は多くの GNU ドキュメントを読み、R 拡張機能を記述し、RcppGSL の使用についてもたくさん読みましたが、C で記述してから関数を R に動的にロードする方が簡単なように思えます。 Windowsで関数を構築する方法を説明している多くの情報源ですが、Unixベースのシステムでそれを使用する方法について私が目にするすべては、それが「比較的簡単」で「単純」であるということですが、私はそれを機能させることができません.

誰かに仕事をしてもらいたくてたまらない C スクリプトは簡単なものです。与えられた数の行と列を持つ配列を取得し、それを gsl_matrix に変換してから配列に戻すだけです (これは基本的に、エントリが何であるか全体を変更することを除いて、私のプログラムが行うことです)。Cスクリプトは

#include <R.h>
#include <stdio.h>
#include <gsl/gsl_linalg.h>

void simple( int *n, int *rows, int *cols)
{
  int r,c;
  int Cols = *cols; //This step, and the step below it are unnecessary except for readability
  int Rows = *rows;
  gsl_matrix * m = gsl_matrix_alloc (Rows, Cols); // Declares a gsl_matrix m of size Rows x Cols

  for( r = 0; r< Rows; r++)
    for (c=0; c< Cols; c++)
      gsl_matrix_set(m,r,c, *(n+sizeof(int)*(Cols*r+c))); // The array is organized by rows, sets matrix values

  for( r=0; r< Rows; r++)
    for (c=0; c < Cols; c++)
      *(n+sizeof(int)*(Cols*r+c))=gsl_matrix_get(m,r,c); // This return matrix values to the array (should be the same as before)
}

私が行ったことは、端末 (Mac OS X) と R が simple.c が保存されている同じディレクトリを共有していることを確認することです。上記のタイピングをコンパイルします

R CMD SHLIB simple.c

端末に入力して、対応する simple.so ファイルを作成し、デスクトップにも保存します。それからRで私はすることができます

dyn.load("simple.so")

これは私がエラーを受け取る場所です

Symbol not found: _gsl_matrix_alloc 
Expected in: flat namespace

コンパイラがmakeファイルを認識しているように見えるため、このエラーに混乱しています< gsl/gsl_linalg.h >.Rがライブラリに接続されていないため、関数が認識されないためだと思いますが、これを解決する方法がわかりません.

この時点で、関数がすべて認識可能であれば、R で関数を実行できます。

x=.C("simple", c(as.integer(c(1,4,7,2,5,8,3,6,9)),as.integer(3),as.integer(3)))

私の関数が動的に正しくロードされた場合、それは機能し、.Cの2番目の入力として入力したものとまったく同じものがXに返されます

GSL ライブラリを Mac OS X 上の R に正常にリンクした人がいるかどうかに関係なく、私にメッセージを送るか、コメントをいただければ幸いです。ヘルプ フォーラムで見つけられる唯一のことは、それが「簡単」または「比較的単純」であるということですが、どうすればよいかわかりません。助けてください!

4

1 に答える 1

3

gsl 関数の場所を指定する必要があります。

R CMD SHLIB simple.c -lgsl -lgslcblas
于 2012-07-19T07:07:35.397 に答える