如何解决RcppEigen #define 在使用 sourceCpp() 时有效,但在 R CMD 构建中被忽略
我注意到 sourceCpp()
尊重 C++ #define
而 devtools::document()
和 R CMD build
似乎无视它们,至少在特征矩阵初始化的情况下是这样。
考虑这个 .cpp 文件:
#define EIGEN_INITIALIZE_MATRICES_BY_ZERO
//[[Rcpp::depends(RcppEigen)]]
#include <RcppEigen.h>
//[[Rcpp::export]]
Eigen::MatrixXd initialize_matrix(int nrow,int ncol) {
return Eigen::MatrixXd(nrow,ncol);
}
可以使用 sourceCpp
获取此文件,然后在 R 中运行以下内容:
> initialize_matrix(5,3)
[,1] [,2] [,3]
[1,] 0 0 0
[2,] 0 0 0
[3,] 0 0 0
[4,] 0 0 0
[5,] 0 0 0
太好了,矩阵初始化为零!
现在将相同的 .cpp 文件放入 RcppEigen 包中并使用 devtools::document()
或 R CMD build
进行编译。
> initialize_matrix(5,3)
[,1] [,2] [,] 1.845608e-317 9.881313e-324 9.881313e-324
[2,] 1.107517e-311 0.000000e+00 0.000000e+00
[3,] 9.881313e-324 0.000000e+00 0.000000e+00
[4,] 0.000000e+00 2.121963e-314 9.881313e-324
[5,] 0.000000e+00 1.107517e-311 0.000000e+00
矩阵不是用零初始化的,而是看起来像一个 memset。
为什么 sourceCpp()
尊重编译指示而 devtools::document()
在编译期间忽略它?
解决方法
我认为,要在包中使用,您需要将 -DEIGEN_INITIALIZE_MATRICES_BY_ZERO
添加到 src/Makevars
,
例如就像在 https://github.com/privefl/bigstatsr/blob/master/src/Makevars#L2 中一样(那里有 2 个犰狳标志)。
或者也许只是订购问题?尝试将 #define
放在 #include <RcppEigen.h>
之后。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。