Eigen::Tensor的切片赋值方法
问题
使用Eigen::Tesnor
进行运算,需要类似Python的切片赋值操作。
实现
可以使用slice
和chip
两个方法实现切片
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