Как использовать cwise операции над конкретными индексами вектора?(Эйген) - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь перевести следующий код 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 голосов
/ 22 октября 2018

Нет эквивалента 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, вы можете, как предложил Ггаэль, написать:

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

(это не определено / вылетает, если indl.size()==0)

0 голосов
/ 21 октября 2018

В ветке по умолчанию вы можете просто написать lamu1(indl) с indl a std::vector<int> или Eigen::VectorXi или любым другим, который поддерживает произвольный доступ через operator[].

...