在Eigen中编写功能,懒惰地评估并且不复制

时间:2018-04-22 05:33:43

标签: c++ eigen

我想在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:具有与写入相同的性能(不可扩展) )内联

0 个答案:

没有答案