将 SuperLU 稀疏求解器与 RcppArmadillo 结合使用
Using SuperLU sparse solver with RcppArmadillo
我正在尝试通过 RcppArmadillo 使用犰狳 (http://arma.sourceforge.net/docs.html#spsolve) 中的 SparseLU 求解器:
#define ARMA_USE_SUPERLU
// [Rcpp::depends(RcppArmadillo)]
#include <RcppArmadillo.h>
// [[Rcpp::export]]
arma::vec sp_solver(arma::sp_mat K, arma::vec x) {
arma::superlu_opts opts;
opts.symmetric = true;
arma::vec res;
arma::spsolve(res, K, x, "superlu", opts);
return res;
}
/*** R
library(Matrix)
K <- sparseMatrix(i = c(1, 2, 1), j = c(1, 2, 2), x = c(1, 1, 0.5), symmetric = TRUE)
x <- runif(2)
sp_solver(K, x)
*/
我收到错误 undefined reference to 'superlu_free'
。
我想我缺少一些库链接。
知道如何解决这个问题吗?
我在 Windows 10.
RcppArmadillo 超级方便,我自己一直在使用它。因为 all Rcpp* 代码将从 R 中调用,我们可以假设存在 一些 功能。
这包括 LAPACK 和 BLAS,并解释了为什么我们可以使用 RcppArmadillo "without linking" 即使 Armadillo 文档清楚地 声明您需要 LAPACK 和 BLAS。为什么?好吧 因为 R 已经有 LAPACK 和 BLAS.
(顺便说一句,当且仅当 R 是用它自己的 LAPACK 子集构建的时,这会导致相当大的早期问题,因为某些复杂的值例程不可用。Baptiste 受到了很大的打击,因为他的包需要(ed) 这些。多年来,Brian Ripley 在将那些缺失的例程添加到 R 的 LAPACK 方面最有帮助。当 R 使用外部 LAPACK 和 BLAS 构建时,人们从来没有遇到过问题,这对于 e.g. 我维护的 Debian/Ubuntu 包。)
在这里你需要SuperLU。这是可选的,你的工作 确保链接。简而言之,它 而不是 只是神奇地工作。而且很难自动化,因为它涉及链接,这让我们无法轻松控制平台依赖性和安装要求。
但是这个问题并不新鲜,事实上an entire Rcpp Gallery post这个话题。
编辑: 使用适合我的系统的 post 中的一行代码,您的代码也可以正常工作(一旦我更正了 Rcpp::depends
以获得所需的双括号:
R> Sys.setenv("PKG_LIBS"="-lsuperlu")
R> sourceCpp("answer.cpp")
R> library(Matrix)
R> K <- sparseMatrix(i = c(1, 2, 1), j = c(1, 2, 2), x = c(1, 1, 0.5), symmetric = TRUE)
R> x <- runif(2)
R> sp_solver(K, x)
[,1]
[1,] 0.264929
[2,] 0.546050
R>
更正代码
#define ARMA_USE_SUPERLU
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
// [[Rcpp::export]]
arma::vec sp_solver(arma::sp_mat K, arma::vec x) {
arma::superlu_opts opts;
opts.symmetric = true;
arma::vec res;
arma::spsolve(res, K, x, "superlu", opts);
return res;
}
/*** R
library(Matrix)
K <- sparseMatrix(i = c(1, 2, 1), j = c(1, 2, 2), x = c(1, 1, 0.5), symmetric = TRUE)
x <- runif(2)
sp_solver(K, x)
*/
我正在尝试通过 RcppArmadillo 使用犰狳 (http://arma.sourceforge.net/docs.html#spsolve) 中的 SparseLU 求解器:
#define ARMA_USE_SUPERLU
// [Rcpp::depends(RcppArmadillo)]
#include <RcppArmadillo.h>
// [[Rcpp::export]]
arma::vec sp_solver(arma::sp_mat K, arma::vec x) {
arma::superlu_opts opts;
opts.symmetric = true;
arma::vec res;
arma::spsolve(res, K, x, "superlu", opts);
return res;
}
/*** R
library(Matrix)
K <- sparseMatrix(i = c(1, 2, 1), j = c(1, 2, 2), x = c(1, 1, 0.5), symmetric = TRUE)
x <- runif(2)
sp_solver(K, x)
*/
我收到错误 undefined reference to 'superlu_free'
。
我想我缺少一些库链接。
知道如何解决这个问题吗?
我在 Windows 10.
RcppArmadillo 超级方便,我自己一直在使用它。因为 all Rcpp* 代码将从 R 中调用,我们可以假设存在 一些 功能。
这包括 LAPACK 和 BLAS,并解释了为什么我们可以使用 RcppArmadillo "without linking" 即使 Armadillo 文档清楚地 声明您需要 LAPACK 和 BLAS。为什么?好吧 因为 R 已经有 LAPACK 和 BLAS.
(顺便说一句,当且仅当 R 是用它自己的 LAPACK 子集构建的时,这会导致相当大的早期问题,因为某些复杂的值例程不可用。Baptiste 受到了很大的打击,因为他的包需要(ed) 这些。多年来,Brian Ripley 在将那些缺失的例程添加到 R 的 LAPACK 方面最有帮助。当 R 使用外部 LAPACK 和 BLAS 构建时,人们从来没有遇到过问题,这对于 e.g. 我维护的 Debian/Ubuntu 包。)
在这里你需要SuperLU。这是可选的,你的工作 确保链接。简而言之,它 而不是 只是神奇地工作。而且很难自动化,因为它涉及链接,这让我们无法轻松控制平台依赖性和安装要求。
但是这个问题并不新鲜,事实上an entire Rcpp Gallery post这个话题。
编辑: 使用适合我的系统的 post 中的一行代码,您的代码也可以正常工作(一旦我更正了 Rcpp::depends
以获得所需的双括号:
R> Sys.setenv("PKG_LIBS"="-lsuperlu")
R> sourceCpp("answer.cpp")
R> library(Matrix)
R> K <- sparseMatrix(i = c(1, 2, 1), j = c(1, 2, 2), x = c(1, 1, 0.5), symmetric = TRUE)
R> x <- runif(2)
R> sp_solver(K, x)
[,1]
[1,] 0.264929
[2,] 0.546050
R>
更正代码
#define ARMA_USE_SUPERLU
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
// [[Rcpp::export]]
arma::vec sp_solver(arma::sp_mat K, arma::vec x) {
arma::superlu_opts opts;
opts.symmetric = true;
arma::vec res;
arma::spsolve(res, K, x, "superlu", opts);
return res;
}
/*** R
library(Matrix)
K <- sparseMatrix(i = c(1, 2, 1), j = c(1, 2, 2), x = c(1, 1, 0.5), symmetric = TRUE)
x <- runif(2)
sp_solver(K, x)
*/