在 RcppArmadillo 中禁用 'Crippled Lapack' 警告

Disable 'Crippled Lapack' warning in RcppArmadillo

我正在使用 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 发现它。