Eigen中创建向量拼接表达式以避免数据复制的方法
在Eigen中无需复制数据拼接向量的方法
可以通过Eigen的表达式模板特性实现,无需分配新内存或复制原数据,而是创建一个直接引用原向量数据的拼接表达式。
具体实现方式
方法1:使用Eigen 3.4+的VerticalStack/HorizontalStack
如果你的Eigen版本是3.4或更新,直接用官方提供的栈式拼接表达式:
#include <Eigen/Dense> int main() { Eigen::VectorXd v1(3); v1 << 1, 2, 3; Eigen::VectorXd v2(2); v2 << 4, 5; // 垂直拼接(行向量用HorizontalStack),无数据复制 auto concat_expr = Eigen::VerticalStack(v1, v2); // 直接用表达式做计算,全程不复制原数据 auto doubled = concat_expr * 2; return 0; }
方法2:自定义Nullary表达式(兼容旧版本)
针对Eigen 3.4之前的版本,可以用NullaryExpr构造一个自定义的拼接表达式,通过lambda直接引用原向量数据:
#include <Eigen/Dense> int main() { Eigen::VectorXd v1(3); v1 << 1, 2, 3; Eigen::VectorXd v2(2); v2 << 4, 5; // 构造拼接表达式,无内存分配和数据复制 auto concat_expr = Eigen::VectorXd::NullaryExpr( v1.size() + v2.size(), [&](Eigen::Index i) { return i < v1.size() ? v1(i) : v2(i - v1.size()); } ); // 示例:用表达式参与矩阵运算 Eigen::MatrixXd mat(5, 5); mat.setRandom(); auto result = mat * concat_expr; return 0; }
关键注意事项
- 拼接表达式仅为原数据的引用视图,必须保证原向量
v1、v2在表达式的生命周期内持续有效,不能提前销毁。 - 只有当你将表达式赋值给一个实际的Eigen向量(比如
Eigen::VectorXd res = concat_expr;)时,才会触发内存分配和数据复制;如果只是用表达式参与后续计算,全程不会复制原数据。
内容的提问来源于stack exchange,提问作者marco
相关产品推荐
相关产品推荐

