我正在試圖爲一些基於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)
我覺得我要去關於這整個過程是錯誤的,因爲沒有什麼工作。任何人在正確的方向踢我?