从函数返回本征::张量切片

时间:2019-06-03 13:16:58

标签: c++ eigen

我想编写返回Eigen :: Tensor切片的函数。在实际代码中,getSlice()接受一些整数,并计算范围和偏移量。我希望我的函数将视图返回到数组中,以便无需复制即可访问数组进行读写。

我可以创建一个变量,该变量是数组的一部分,并更改数据。但是,当我从函数返回相同的片段时,值不会改变。我猜该函数将生成一个新数组作为返回值。如何退回我需要的切片?还是应该以其他方式执行此操作?

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

Eigen::Tensor<float,3> getSlice(Eigen::Tensor<float,3>& a,
                Eigen::array<long,3>& offset,
                Eigen::array<long,3>& extent)
{
   return a.slice(offset,extent);
}

int main()
{
   Eigen::Tensor<float,3> et = Eigen::Tensor<float,3>(3,5,4);
   et.setConstant(1.1);
   std::cout << et << std::endl;

   Eigen::array<long,3> offset = {0,0,0};
   Eigen::array<long,3> extent = {2,2,1};

   et.slice(offset,extent).setConstant(2.2);
   std::cout << "Set slice constant" << std::endl;
   std::cout << et << std::endl;

   auto sl = et.slice(offset,extent);
   sl.setConstant(3.3);
   std::cout << "Set slice constant from slice instance." << std::endl;
   std::cout << et << std::endl;

   getSlice(et,offset,extent).setConstant(4.4);
   std::cout << "Set slice constant from function." << std::endl;
   std::cout << et << std::endl;
}

程序输出:

$ ./ta

1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1

设置切片常数

2.2 2.2 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 2.2 2.2 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1

设置切片实例中的切片常量。

3.3 3.3 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 3.3 3.3 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1

通过功能设置切片常数。

3.3 3.3 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 3.3 3.3 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1 1.1

1 个答案:

答案 0 :(得分:1)

您发现getSlice的实现返回一个新的Tensor对象(带有原始数据的副本)是正确的。在您的情况下,最简单的解决方案是将返回类型更改为auto(尽管,通常应该注意auto和Eigen):

inline auto getSlice(Eigen::Tensor<float,3>& a,
                Eigen::array<long,3>& offset,
                Eigen::array<long,3>& extent)
{
   return a.slice(offset,extent);
}

实时演示:https://godbolt.org/z/tLWYUz