如何对向量的特定索引使用 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()
函数等价的函数,我对此很放心,并且对其进行了暴力破解。
现在,如果我想对 lamu1
和 dlamu1
进行系数除法,我会选择 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
)
我正在尝试将以下 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
的系数指定了哪些指标?我没有在文档中找到任何关于此的信息,但也许我没有使用正确的搜索词。
使用默认分支,你可以只写 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
)