RcppEigen #define 在使用 sourceCpp() 时有效,但在 R CMD build 中被忽略
RcppEigen #define works when using sourceCpp() but ignored with R CMD build
我注意到 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] [,3]
[1,] 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()
尊重 pragma 声明而 devtools::document()
在编译期间忽略它?
我认为,要在包中使用,您需要将 -DEIGEN_INITIALIZE_MATRICES_BY_ZERO
添加到 src/Makevars
,
例如如 https://github.com/privefl/bigstatsr/blob/master/src/Makevars#L2(那里有 2 个犰狳标志)。
或者只是顺序问题?尝试将 #define
放在 #include <RcppEigen.h>
之后。
我注意到 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] [,3]
[1,] 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()
尊重 pragma 声明而 devtools::document()
在编译期间忽略它?
我认为,要在包中使用,您需要将 -DEIGEN_INITIALIZE_MATRICES_BY_ZERO
添加到 src/Makevars
,
例如如 https://github.com/privefl/bigstatsr/blob/master/src/Makevars#L2(那里有 2 个犰狳标志)。
或者只是顺序问题?尝试将 #define
放在 #include <RcppEigen.h>
之后。