如何对向量的特定索引使用 cwise 操作? (本征)

How to use cwise operations over specific indexes of a vector? (Eigen)

我正在尝试将以下 Matlab 代码转换为 C/C++。

indl = find(dlamu1 < 0);  indu = find(dlamu2 < 0);
s = min([1; -lamu1(indl)./dlamu1(indl); -lamu2(indu)./dlamu2(indu)]);

我在另一个线程上读到,Eigen 库中还没有与 find() 函数等价的函数,我对此很放心,并且对其进行了暴力破解。

现在,如果我想对 lamu1dlamu1 进行系数除法,我会选择 lamu1.cwiseQuotient(dlamu1) 但我该怎么做才能做到这一点他们的一些系数,indl的系数指定了哪些指标?我没有在文档中找到任何关于此的信息,但也许我没有使用正确的搜索词。

使用默认分支,你可以只写 lamu1(indl)indl 一个 std::vector<int> 或一个 Eigen::VectorXi 或任何你喜欢的支持通过 [=14= 随机访问的东西].

即使在默认分支中也没有 find 的等价物(目前)。但是,您的函数可以使用 select 方法表示(也适用于 Eigen 3.3.x):

double ret1 = (dlamu1.array()<0).select(-lamu1.cwiseQuotient(dlamu1), 1.0).minCoeff();
return std::min(1.0,ret1); // not necessary, if dlamu1.array()<0 at least once

select 惰性求值,即只有当条件为真时,才会计算商。另一方面,上面的代码会发生很多与1.0不必要的比较。

如果[d]lamu存储在Eigen::ArrayXd而不是Eigen::VectorXd,你可以这样写:

double ret1 = (dlamu1<0).select(-lamu1/dlamu1, 1.0).minCoeff();

如果你暴力破解 indl 无论如何,你可以按照 ggael 的建议写:

lamu1(indl).cwiseQuotient(dlamu1(indl)).minCoeff();

(这是 undefined/crashes 如果 indl.size()==0