You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:52:50