如何将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
相关产品推荐
相关产品推荐

