我正在尝试将以下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的系数指定?我没有在文档中找到关于此的任何信息,但是也许我没有使用正确的搜索词。
答案 0 :(得分:1)
使用默认分支,您可以只用lamu1(indl)
或indl
或std::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
,则未定义/崩溃)