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

时间:2018-10-21 14:18:31

标签: eigen eigen3

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

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

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

现在,如果我想对lamu1和dlamu1进行系数明智的划分,我会选择lamu1.cwiseQuotient(dlamu1);但是我该怎么做,而仅针对它们的某些系数,哪些索引由indl的系数指定?我没有在文档中找到关于此的任何信息,但是也许我没有使用正确的搜索词。

2 个答案:

答案 0 :(得分:1)

使用默认分支,您可以只用lamu1(indl)indlstd::vector<int>编写Eigen::VectorXi或任何支持通过operator[]进行随机访问的内容。

答案 1 :(得分:1)

即使在默认分支中,也没有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的计算是惰性的,即,仅当条件为true时,才会计算商。另一方面,上面的代码会与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();

(如果indl.size()==0,则未定义/崩溃)