C++ 从函数返回am Eigen::张量切片

C++ 从函数返回am Eigen::张量切片,c++,eigen,C++,Eigen,我想写一些函数,返回特征::张量的切片。在实际代码中,getSlice()接受一些整数,并计算范围和偏移量。我希望我的函数将视图返回到数组中,这样我就可以访问数组进行读写而无需复制 我可以创建一个变量,它是数组的一部分,并修改数据。但是,当我从函数返回相同的切片时,值不会改变。我猜想该函数会生成一个新数组作为返回值。我该如何退回我需要的切片?还是我应该用另一种方式 #include <iostream> #include <Eigen/Dense> #include &l

我想写一些函数,返回特征::张量的切片。在实际代码中,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;
}
#包括
#包括
#包括
特征::张量getSlice(特征::张量&a,
特征::阵列和偏移,
特征::数组和范围)
{
返回a.slice(偏移量、范围);
}
int main()
{
本征张量et=本征张量(3,5,4);
et.setConstant(1.1);

std::cout您观察到的
getSlice
的实现返回一个新的张量对象(带有原始数据的副本)是正确的。在您的情况下,最简单的解决方案是将返回类型更改为
auto
(尽管您通常应该小心使用
auto
和Eigen):

内联自动获取切片(Eigen::Tensor&a,
特征::阵列和偏移,
特征::数组和范围)
{
返回a.slice(偏移量、范围);
}
现场演示:

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