避免复制重复使用的特征块
avoid making copy of an eigen block that's repeated used
是否可以不复制到下面第3行的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}
调用之间复制代码,并且当获取边界的表达式长于上面的玩具示例。
使用 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>
。
神箭-Link: https://godbolt.org/z/OzY759
请注意,在您的示例中,values
和 all_bounds
均未初始化(我假设只是为了让示例简短)。
是否可以不复制到下面第3行的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}
调用之间复制代码,并且当获取边界的表达式长于上面的玩具示例。
使用 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>
。
神箭-Link: https://godbolt.org/z/OzY759
请注意,在您的示例中,values
和 all_bounds
均未初始化(我假设只是为了让示例简短)。