我正在试图为一些基于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)
我觉得我要去关于这整个过程是错误的,因为没有什么工作。任何人在正确的方向踢我?