我有一个函数compute()
作为输入
矩阵C
并输出相同维度的矩阵X
,并执行以下操作:
C_j
,如果其正元素的总和小于或等于1,则X_j
的{{1}}列与{{1}相同除了将非正元素设置为零之外,即X
(在Matlab语言中)。 C_j
其中X_j = C_j(C_j > 0)
是某种功能。这部分与此问题无关。到目前为止我的尝试。
X_j = f(C_j)
对于f
答案 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的任何进展)。
这意味着您当前的循环实现实际上可能更快(这可能还取决于其他几个因素,例如输入的大小)。