2012-07-19 62 views
1

我一直在C程序上工作了一段時間,該程序使用GSL中的函數運行MCMC。我已經閱讀了很多GNU文檔和寫作R擴展,並且我已經閱讀了大量有關使用RcppGSL的內容,但在我看來,使用C編寫代碼更容易,然後將函數動態加載到R.我已經看到許多來源描述如何在Windows上構建函數,但是我所看到的關於如何在基於Unix的系統上使用它的一切都是「相對簡單」和「簡單」的,但我無法實現它。將GNU科學庫鏈接到Mac OS X上的R

我渴望某人去上班的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 I可以做

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))) 

如果我的函數動態加載正確,將工作執行的功能,我會回來的X到底是什麼我把作爲第二輸入.C

任何有識之士將是非常有益的,任何人是否已經成功地鏈接的GSL庫至R在Mac OS X可以給我發短信或評論,將不勝感激。我在幫助論壇上唯一能找到的就是它「直接」或「相對簡單」,但我不知道該怎麼做!請幫忙!

+0

你看了'gsl'包?即使您想自己編寫C代碼,瀏覽源代碼也應該提供信息。 http://cran.r-project.org/web/packages/gsl/index.html – 2012-07-19 09:47:12

+1

RcppGSL值得一看。更多信息:http://dirk.eddelbuettel.com/code/rcpp.gsl.html – dickoa 2012-07-19 09:56:21

+0

可能的興趣:http://stackoverflow.com/q/11346083/420055。 – chl 2012-08-05 09:47:08

回答

3

你需要指定的GSL功能:

R CMD SHLIB simple.c -lgsl -lgslcblas 
+2

......除了'-l'標誌可能需要'-L/path/to/gsl/libraries'外 – 2012-07-19 13:25:20

相關問題