2011-02-15 142 views
2

我正在試圖爲一些基於C的稀疏矩陣處理代碼打包(請參閱previous question)。爲了調用的主力C函數,我需要創建看起來像這樣的結構:從R對象提取long []

struct smat { 
    long rows; 
    long cols; 
    long vals;  /* Total non-zero entries. */ 
    long *pointr; /* For each col (plus 1), index of first non-zero entry. */ 
    long *rowind; /* For each nz entry, the row index. */ 
    double *value; /* For each nz entry, the value. */ 
}; 

這些很好地對應於一個dgCMatrix稀疏矩陣的插槽。因此,理想情況下,我只需指向dgCMatrix中的內部數組(在驗證C函數不會與數據混淆[我還沒有完成]之後)。

對於*value,看起來我可以根據需要使用REALSXP或其他來獲得double[]。但是對於*pointr*rowind,我不確定是否能找到合適的數組。我是否需要遍歷條目並將它們複製到新數組中,並按照我的方式進行投射?或者Rcpp可以在這裏提供一些糖嗎?這是我第一次真正使用Rcpp,而且我還沒有精通它。

謝謝。

編輯:我也有一些鏈接麻煩,我不明白:

Error in dyn.load(libLFile) : 
    unable to load shared object '/var/folders/TL/TL+wXnanH5uhWm4RtUrrjE+++TM/-Tmp-//RtmpAA9upc/file2d4606aa.so': 
    dlopen(/var/folders/TL/TL+wXnanH5uhWm4RtUrrjE+++TM/-Tmp-//RtmpAA9upc/file2d4606aa.so, 6): Symbol not found: __Z8svdLAS2AP4smatl 
    Referenced from: /var/folders/TL/TL+wXnanH5uhWm4RtUrrjE+++TM/-Tmp-//RtmpAA9upc/file2d4606aa.so 
    Expected in: flat namespace 
in /var/folders/TL/TL+wXnanH5uhWm4RtUrrjE+++TM/-Tmp-//RtmpAA9upc/file2d4606aa.so 

我需要要創建我的圖書館有一些特殊的編譯標誌?

編輯2:它看起來像我的libargs參數沒有效果,因此libsvd符號永遠不會將它放入庫中。我能找到沒有辦法使用cxxfunction()包括圖書館 - 這裏就是我想要嘗試,但額外的參數(從cfunction()如意thinkingly借用)都默默地吞噬了:

fn <- cxxfunction(sig=c(nrow="integer", mi="long", mp="long", mx="numeric"), 
        body=code, 
        includes="#include <svdlib.h>\n", 
        cppargs="-I/Users/u0048513/Downloads/SVDLIBC", 
        libargs="-L/Users/u0048513/Downloads/SVDLIBC -lsvd", 
        plugin="Rcpp", 
        verbose=TRUE) 

我覺得我要去關於這整個過程是錯誤的,因爲沒有什麼工作。任何人在正確的方向踢我?

回答

0

我已經做了[R]類似-Smalltalk接口的東西,去年,前往它更爲通用,以能夠使用字節數組傳遞所有的數據備份和反覆:

在C I具有:

DLLIMPORT void getLengthOfNextMessage(byte* a); 
DLLIMPORT void getNextMessage(byte* a); 

在R:

getLengthOfNextMessage <- function() { 
    tmp1 <- as.raw(rep(0,4)) 
    tmp2<-.C("getLengthOfNextMessage", tmp1) 
    return(bvToInt(tmp2)) 
} 

receiveMessage <- function() { 
    #if(getNumberOfMessages()==0) { 
    # print("error: no messages") 
    # return(); 
    #} 
    tmp1<-as.raw(rep(0, getLengthOfNextMessage()+getSizeOfMessages())) 
    tmp2<-.C("getNextMessage", tmp1) 
    msg<-as.raw(tmp2[[1]]) 
     print(":::confirm received") 
     print(bvToInt(msg[13:16])) 
    # confirmReceived(bvToInt(msg[13:16])) 
    return(msg) 
} 

我已註釋的使用功能getNumberOfMessages()和confirmReceived(),其是特定的問題,我不得不解決(多來回通信)。本質上,代碼使用參數字節數組傳輸信息,首先是4字節長的信息,然後是實際數據。這看起來不太優雅(即使對我來說)比使用結構,但我發現它更通用,我可以掛鉤到任何DLL,傳輸任何數據類型。