避免复制重复使用的本征块

时间:2019-11-03 19:13:02

标签: c++ eigen eigen3

是否可以不将其复制到下面第三行的bounds中?

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 个答案:

答案 0 :(得分:2)

使用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


请注意,在您的示例中,valuesall_bounds都没有初始化(我假设只是为了使示例简短)。