如何抑制Rcpp/RcppArmadillo函数中的警告信息
RcppArmadillo屏蔽
eig_sym()对称性警告的实现方法 方案1:单次调用粒度控制(最优,不影响其他代码警告)
无需修改全局警告配置,eig_sym()原生支持跳过对称性校验的参数,从根源避免触发对应警告,完全不影响其他位置的警告输出:
// 需要特征值和特征向量的调用写法 arma::vec eig_vals; arma::mat eig_vecs; // 传入arma::no_sym_check跳过内置对称性检查 arma::eig_sym(eig_vals, eig_vecs, target_mat, arma::no_sym_check); // 仅需要特征值的调用写法 arma::vec eig_vals = arma::eig_sym(target_mat, arma::no_sym_check);
稳妥性优化:如果需要进一步规避浮点误差影响,可在调用
eig_sym()前对矩阵做强制对称化,处理后矩阵满足机器精度对称,即使开启对称性检查也不会触发警告:target_mat = arma::symmatl(target_mat); // 用下三角元素对称填充上三角 // 或使用arma::symmatu(target_mat),用上三角元素对称填充下三角
方案2:全局屏蔽所有Armadillo运行时警告
之前添加#define ARMA_WARN_LEVEL 0不生效的原因是:RcppArmadillo会在引入自身头文件时预先定义ARMA_WARN_LEVEL宏,在include语句之后定义宏会触发重定义提示,且配置无法覆盖默认值。
两种正确的全局配置方式二选一即可:
- 方式1(包开发推荐,适配性最好):修改包
src/目录下的Makevars和Makevars.win文件,添加编译期宏定义,在所有源文件编译前传入配置:PKG_CPPFLAGS = -DARMA_WARN_LEVEL=0 - 方式2:在代码文件中定义宏,必须保证宏定义放在
#include <RcppArmadillo.h>语句之前,才会覆盖默认配置:
注意该方式需要在所有引入RcppArmadillo的源文件中按顺序添加定义,否则仍会出现重定义或配置不生效问题,优先选择Makevars配置方式。// 宏定义必须放在RcppArmadillo头文件引入之前 #define ARMA_WARN_LEVEL 0 #include <RcppArmadillo.h>
内容的提问来源于stack exchange,提问作者Stephen Coleman
相关产品推荐
相关产品推荐

