当你使用SuperLU时,你将离开(非常方便的)只使用头文件库的世界,比如你在这里使用的库:
-
Armadillo通过RcpArmadillo(因为从R使用时不需要链接到LAPACK/BLAS)
-
ensmallen通过RcppEnsmall,因为它只是标题
-
通过BH进行增强,因为它专注于仅包含头部的子集。
-
mlpack,从4.0版本开始,它只与R一起工作。
但是稀疏线性代数需要链接。这可以通过以下方式解释和演示
an Rcpp Gallery article
来自RcppArmadillo的两位作者。
一般来说,通常建议先解决较小的子集问题。你不是真的
mlpack
这里的问题:您在使用时遇到问题
RcppArmadillo
通过稀疏分解,您可以链接到
-lsuperlu
正如Rcpp画廊所描述和展示的那样。我会试着让它发挥作用,然后试着继续
mlpack
问题。
PS 1
你的代码还有另一个问题阻止它运行:行为改变
#define
必须
来之前
#include
所以请移动
#define ARMA_USE_ARPACK 1
#define ARMA_USE_SUPERLU 1
到最顶端。然后,当运行时出现正常的编码问题时,它就会工作:
> Rcpp::sourceCpp("soquestion20241227.cpp")
> set.seed(123)
> NNGP_fit(3)
flag eig
status= 0
Error in getClass("dgCMatrix") : âdgCMatrixâ is not a defined class
请注意,为了走到这一步,我必须启用
链接
通过envoirment变量使用SuperLU,我根据Rcpp Gallery示例代码进行了验证:
> Sys.setenv("PKG_LIBS"="-lsuperlu")
> Rcpp::sourceCpp("gallery20170217.cpp")
> superLuDemo()
Done.
>
>
设置此项很重要
之前
你第一次打电话
Rcpp::sourceCpp()
因为其中一些内容似乎是按会话缓存的。
PS 2
这是一个
可重复性
成功。请注意,我加载了
Matrix
打包(用于稀疏矩阵支持)并将种子设置为可重复的。
> library(Matrix)
> Sys.setenv("PKG_LIBS"="-lsuperlu")
> Rcpp::sourceCpp("soquestion20241227.cpp")
> set.seed(123)
> NNGP_fit(5)
flag eig
status= 0
$covmat
5 x 5 sparse Matrix of class "dgCMatrix"
[1,] 0.0827008 . . . 0.226699
[2,] . . . . .
[3,] . . . . .
[4,] . . . . .
[5,] 0.2266988 . . . 0.788687
$eigval
[,1]
[1,] 7.05517e-33
[2,] 6.13069e-17
[3,] 1.61746e-02
[4,] 8.55213e-01
$eigvec
[,1] [,2] [,3] [,4]
[1,] 1.97882e-16 -7.23362e-15 9.59537e-01 -2.81582e-01
[2,] 1.64671e-01 7.22721e-01 5.40204e-15 2.43186e-17
[3,] -3.27270e-02 -6.76148e-01 -5.07065e-15 -1.23420e-17
[4,] -9.85805e-01 1.43172e-01 1.05140e-15 1.94107e-18
[5,] 3.29803e-17 2.09006e-15 -2.81582e-01 -9.59537e-01
$y
[,1]
[1,] 0.0699539
[2,] 0.9767215
[3,] 2.1650415
[4,] -1.8262054
[5,] 0.5804146
$mu_f
[,1]
>