如何在Eigen / C ++中进行向量化:在条件

时间:2016-10-30 22:53:31

标签: c++ optimization vectorization eigen

我有一个函数compute()作为输入  矩阵C并输出相同维度的矩阵X,并执行以下操作:

  • 对于C的每个列C_j,如果其正元素的总和小于或等于1,则X_j的{​​{1}}列与{{1}相同除了将非正元素设置为零之外,即X(在Matlab语言中)。
  • 否则C_j其中X_j = C_j(C_j > 0)是某种功能。这部分与此问题无关。

到目前为止我的尝试。

X_j = f(C_j)

对于f

的每一列

1 个答案:

答案 0 :(得分:1)

我发现问题的最短解决方案是:

MatrixXd compute(const MatrixXd& C)
{
    MatrixXd P = C.cwiseMax(0.0); // cheaper than (...).select(C,0)
    RowVectorXd S = P.colwise().sum(); // colwise().sum() returns only one row
    MatrixXd X = (S.array()<=1).replicate(C.rows(), 1).select(P, 0.0);
    //      compare by 1 --^             ^               ^  
    // replicate result of comparison ---/               |
    //        select P or 0 depending on comparison  ----/
    return X;
}

请注意,目前(版本3.3rc2)的比较和select都没有在Eigen中进行矢量化(但最终它们应该是http://eigen.tuxfamily.org/bz/show_bug.cgi?id=97的任何进展)。 这意味着您当前的循环实现实际上可能更快(这可能还取决于其他几个因素,例如输入的大小)。