Loading

Eigen::Tensor的切片赋值方法

问题

使用Eigen::Tesnor进行运算,需要类似Python的切片赋值操作。

实现

可以使用slicechip两个方法实现切片

slice

用法 slice(const StartIndices& offsets, const Sizes& extents)
切片后维度不变,从offsets切出extents长度的局部Tesnor并返回左值

Eigen::Tensor<int,2> tensor;
tensor.slice(Eigen::array<size_t,2>{0,1}, Eigen::array<size_t,2>{2,2});

对应Python实现

tensor[:2, 1:3]

chip

用法 chip(const Index offset, const Index dim)
具体从第dim维度方向偏移offset进行切片返回左值,切片后rank - 1

Eigen::Tensor<int,2> tensor;
tensor.chip(2, 1);

对应Python实现

tensor[: , 2]

配合

配合使用完成变维度切片赋值

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

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

   for (size_t i = 0; i < 3; ++i)
   {
        et.chip(i,0).slice( \
            Eigen::array<size_t,2>{1,1}, Eigen::array<size_t,2>{i+1,i+1}).setConstant(1);
   }
   std::cout << "Set slice constant" << std::endl;
   std::cout << et << std::endl;

}

在线演示 https://godbolt.org/z/z538oa1sf

参考

Eigen-unsupported: Eigen Tensors

posted @ 2022-05-01 21:11  azureology  阅读(3389)  评论(0编辑  收藏  举报