我想在Eigen中编写一个具有良好性能的函数。我当前的代码做了我喜欢做的事情,但我基本上定义了每个变量的预处理器定义中的函数。我正在写一个有限差分函数(基本上是numpy'差异()),所以如果有人可以指出我,它会很棒,但我也有一些相似的功能(一个预先形成加权平均而不是差异),这要求我编写这些函数。 我当前的代码看起来像这样(只包括相关部分):
#include <Eigen/Dense>
#include <iostream>
#include <ctime>
typedef Eigen::MatrixXd matrix;
const int size = 2048;
matrix temps(size, size) = matrix::Random(size, size);
matrix Kx, Qx, Q;
int main() {
//timing start
for(int i = 0; i < 100; i++) {
#define DIFFX (temps.bottomRows(size - 1) - temps.topRows(size - 1))
Qx = DIFFX.cwiseProduct(Kx);
//other code
#define DIFF2X (Qx.rightCols(size - 2) - Qx.leftCols(size - 2))
Q.block(0, 1, size, size - 2) += DIFF2X;
//etc
}
//timing stop
}
我想将DIFFX重构为一个单独的函数,例如:
template <typename Derived>
inline Derived diffX(const Eigen::DenseBase<Derived>& I) {
return I.rightCols(I.cols() - 1) - I.leftCols(I.cols() - 1);
}
我的问题是,当我用DIFFX
替换第一个diffX(temps)
时,我会从每个周期的0.12秒一致到0.17秒(包括周期中的所有其他操作)。 (这是一个紧凑的循环,将有几十个这样的操作,因此性能相当重要)
我的问题是,我如何编写扩展Eigen的函数1:不做无用的复制,2:将进行适当的懒惰评估和智能简化为3:具有与写入相同的性能(不可扩展) )内联