избегайте копирования собственного блока, который повторяется - PullRequest
0 голосов
/ 03 ноября 2019

Возможно ли не сделать копию в bounds в 3-й строке ниже?

Eigen::VectorXd all_bounds(100);
Eigen::VectorXd values(10);
Eigen::VectorXd bounds = all_bounds.segment(20, 10);
values = values.cwiseMin(bounds);
values = values.cwiseMax(-bounds);

Один из способов, который я могу придумать, - встроить bounds.segment(20, 10) в cwise{Min,Max}() вызов, но этодублирует код между cwise{Min,Max} вызовами и становится уродливым, когда выражение для получения границ длиннее, чем в приведенном выше игрушечном примере.

1 Ответ

2 голосов
/ 03 ноября 2019

С C ++ 11 вы можете просто написать

auto bounds = all_bounds.segment(20, 10);

В противном случае, или если вы хотите избежать (в сочетании с Eigen) потенциально опасного ключевого слова auto, вы можете написать

Eigen::Ref<Eigen::VectorXd> bounds = all_bounds.segment(20, 10);

Если all_bounds только для чтения, используйте Eigen::Ref<const Eigen::VectorXd>.

Godbolt-Link: https://godbolt.org/z/OzY759


Обратите внимание, что в вашем примере оба values и all_bounds не были инициализированы (я полагаю, просто для краткости примера).

...