使用带有 RcppArmadillo 的 SuperLU 稀疏求解器

Posted

技术标签:

【中文标题】使用带有 RcppArmadillo 的 SuperLU 稀疏求解器【英文标题】:Using SuperLU sparse solver with RcppArmadillo 【发布时间】:2020-03-29 07:36:55 【问题描述】:

我正在尝试通过 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。

【问题讨论】:

【参考方案1】:

RcppArmadillo 超级方便,我自己一直在使用它。因为 all Rcpp* 代码将从 R 中调用,我们可以假设存在 一些 功能。

这包括 LAPACK 和 BLAS,并解释了为什么即使 Armadillo 文档明确声明您需要 LAPACK 和 BLAS,我们也可以“不链接”使用 RcppArmadillo。为什么?好吧因为 R 已经有 LAPACK 和 BLAS

(顺便说一句,当且仅当 R 是用它自己的 LAPACK 子集构建时,这会导致相当多的早期问题,因为某些复杂的值例程不可用。Baptiste 受到了相当大的打击,因为他的包需要(ed ( /Ubuntu 包我维护。)

这里你想要 SuperLU。这是可选的,你的工作确保它被链接。简而言之,它确实只是神奇地工作。而且很难实现自动化,因为它涉及到链接,这让我们无法轻松控制平台依赖和安装要求。

不过这个问题并不新鲜,其实有an entire Rcpp Gallery 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 的 SuperLU 稀疏求解器的主要内容,如果未能解决你的问题,请参考以下文章

将大型矩阵传递给 RcppArmadillo 函数而不创建副本(高级构造函数)

错误:R 3.5.3 上的 RcppArmadillo 包延迟加载失败

RcppArmadillo: arma::cube 的向量

RcppArmadillo 和 Armadillo 之间的性能差异

使用 RcppArmadillo 时调用 one 或 eye 函数失败

在 R 中使用 RcppArmadillo 包和 rowvec 时出现编译错误