r - 禁用 RcppArmadillo 中的 'Crippled Lapack' 警告

标签 r rcpp armadillo

我正在使用 RcppArmadillo 来求解线性系统。来自 CRAN 的 Mac 的 R 二进制文件配置为使用 BLAS 和 Lapack 的内置子集,但我尚未成功构建 R 以使用外部 BLAS + Lapack(我向 r-sig-mac 发送了一封电子邮件寻求帮助,但到目前为止尚未收到任何答复)。

不幸的是,除了可能缺乏性能之外,每次运行代码时我都会收到低级警告,

warning: solve(): refinement and/or equilibration not done due to crippled LAPACK

它很快就会填满我的终端控制台(我正在循环运行它)。如何配置 RcppArmadillo 不发出此警告?

sessionInfo()
R version 3.3.0 Patched (2016-06-05 r70718)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11.4 (El Capitan)

locale:
[1] en_NZ.UTF-8/en_NZ.UTF-8/en_NZ.UTF-8/C/en_NZ.UTF-8/en_NZ.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] RcppArmadillo_0.7.200.1.0

loaded via a namespace (and not attached):
[1] tools_3.3.0 Rcpp_0.12.5

最佳答案

安装时看configure;检查测试输出。代码(减去一些注释)本质上是:

## external LAPACK has the required function
lapack=$(${R_HOME}/bin/R CMD config LAPACK_LIBS)
hasRlapack=$(echo ${lapack} | grep lRlapack)

if [ "${hasRlapack}" == "" ]; then
    ## We are using a full Lapack and can use zgesdd -- so #undef remains
    echo "system LAPACK found"
    cp inst/include/RcppArmadilloLapack.h.in inst/include/RcppArmadilloLapack.h 
else
    ## We are using a R's subset of Lapack and CANNOT use zgesdd etc, so we mark it
    echo "R-supplied partial LAPACK found"
    echo "* some operations may not be available"
    sed -e 's/\/\/ \#undef ARMA_CRIPPLED_LAPACK/\#define ARMA_CRIPPLED_LAPACK 1/' \
        inst/include/RcppArmadilloLapack.h.in > inst/include/RcppArmadilloLapack.h 
fi

简而言之,您有两个选择:

i) 有一个真正的外部 LAPACK 或

ii) 使用捆绑了完整 LAPACK 的 R 版本——即 R 3.3.0。

2016 年 3 月 12 日编辑:因此存在一个错误,即在没有系统 LAPACK 的情况下无法正确识别 R 3.3.0 - 即 OS X 作为糟糕的 Windoze无论如何处理方式不同。现在,这已在 GH 存储库中得到解决。感谢@baptiste 发现它。

关于r - 禁用 RcppArmadillo 中的 'Crippled Lapack' 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35953178/

相关文章:

c++ - 如何让 Armadillo 函数在反转奇异矩阵时不打印错误?

c++ 自动覆盖有符号/无符号

r - 需要Rcpp软件包中使用的OpenMP可用性

r - Ctrl + Shift + D 不运行文档例程

r - 通过非 sf 列内部连接两个 sf 对象

r - 仅提取字符串中的 5 位数字

r - R中data.table中的快速子集化

Rcpp:将 SEXP 转换为 float / double

c++ - 使用 Rcpp 制作包并尝试让一个类引用另一个类

c++ - Armadillo :从稀疏矩阵中获取稀疏行 vector 的非零位置