我正在尝试为一些基于 C 的稀疏矩阵处理代码制作一个包装器(请参阅上一个问题)。为了调用主力 C 函数,我需要创建一个如下所示的结构:
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
and *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()
)被默默地吞噬了:
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)
我觉得我的整个过程都错了,因为没有任何效果。有人踢我正确的方向吗?