我是C ++的初学者,我很感激建议优化我用Eigen编写的以下函数(事实上,与RcppEigen一起使用)。
到目前为止,与使用R编写的相应函数相比,我观察到的速度提高了3.5倍,我想知道是否可以获得更多。
请注意,我正在使用非常大的矩阵,所以我依靠地图来避免R中相应对象的副本。
提前感谢您的帮助!
#include <RcppEigen.h>
using namespace Rcpp;
using namespace Eigen;
typedef Map<ArrayXd> MapArr1D;
typedef Map<ArrayXXd> MapArr2D;
typedef Map<MatrixXd> MapMat;
typedef Map<VectorXd> MapVec;
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::export]]
void myFct(const MapMat M1, const MapMat M2, MapMat M3, MapMat M4, MapArr2D A1,
MapArr2D A2, const MapArr1D a1, const MapArr1D a2, const MapArr1D a3,
const MapArr1D a4, const MapArr1D a5, const double d1) {
for (int j = 0; j < M1.cols(); ++j) {
M4.noalias() -= M1.col(j) * M3.row(j);
A1.row(j) = a1 * a2 * ((M2 - M4).transpose() * M1.col(j)).array();
A2.row(j) = exp(-Fct(a3(j) - a4(j) - a5 / 2 - d1 / 2 -
pow(A1.row(j).transpose(), 2) / (2 * a1) - log(a1) / 2));
M3.row(j) = A1.row(j) * A2.row(j);
M4.noalias() += M1.col(j) * M3.row(j);
}
}
其中Fct
是其他功能。