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

如何将Eigen张量切片传递给可修改原张量的函数?

直接通过切片修改Eigen原张量的实现方案

你当前的代码需要先把切片拷贝到临时变量,修改后再赋值回原张量,核心问题在于do_something函数接收的是TensorFixedSize的值拷贝,而x.slice()返回的是临时的TensorSlice表达式对象,赋值给myslice时会触发拷贝,导致修改的是副本而非原张量。

要实现直接传递切片修改原张量,关键是让函数接收原切片的可修改引用,而非拷贝。Eigen提供的TensorRef可以包装张量表达式,实现对原数据的直接引用操作。

修改后的完整代码

#include <unsupported/Eigen/CXX11/Tensor>
#include <Eigen/Dense>

// 定义全局常量(需放在函数作用域外)
constexpr int nx = 10;
constexpr int ny = 10;
constexpr int nz = 10;

// 用TensorRef接收可修改的切片引用
void do_something(Eigen::TensorRef<Eigen::TensorFixedSize<double, Eigen::Sizes<nx, 1, 1>>> vector) {
    // 直接修改原张量的切片区域
    vector.setConstant(123.0);
}

int main() {
    Eigen::TensorFixedSize<double, Eigen::Sizes<nx, ny, nz>> x;
    x.setZero();
    
    Eigen::array<Eigen::Index, 3> offsets = {0, 0, 0};
    Eigen::array<Eigen::Index, 3> extents = {nx, 1, 1};
    
    // 直接传递切片表达式给函数,无需中间拷贝
    do_something(x.slice(offsets, extents));
    
    // 此时原张量x的对应切片已被修改为123.0
    return 0;
}

额外说明

如果需要支持不同大小的切片,可将函数改为模板形式,自动推导传入的切片表达式类型:

template <typename TensorExpr>
void do_something(TensorExpr&& vector) {
    vector.setConstant(123.0);
}

这种写法同样能直接修改原张量,且灵活性更高。

内容的提问来源于stack exchange,提问作者davideperrone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:15:41