如何在Eigen3中重塑张量?

时间:2019-07-11 09:16:31

标签: c++ tensor eigen3

我从C ++中的tensorflow会话的输出向量中获得了一些Eigen :: TensorMap。我想对Eigen :: TensorMap进行一些操作(重塑和合并等)。

但是,由于一些奇怪的错误,我的代码无法编译。 我试图用纯Eigen3代码重现它。

#include <unsupported/Eigen/CXX11/Tensor>
using Eigen::Tensor;
using Eigen::TensorMap;
using Eigen::TensorRef;
using std::vector;
int main() {
    int storage[128];
    TensorMap<Tensor<int, 4>> t_4d(storage, 2, 4, 2, 8);
    vector<TensorRef<Tensor<int,2>>> reshapedTensors;
    std::array<int, 2> shape{ 16,8 };
    auto re_op = t_4d.reshape(shape);
    reshapedTensors.push_back(re_op);
    return 0;
}

根据Eigen Doc,重整函数的返回类型是一个本征运算,它将延迟计算。 TensorRef是所有张量操作的包装。

这段代码会抱怨:

严重性代码描述项目文件行抑制状态 错误C2679二进制'=':未找到采用类型为'const std :: array'的右侧操作数的运算符(或没有可接受的转换)testEigen D:\ Programming \ cpp库\ eigen-eigen-323c052e1731 \不支持\ Eigen \ CXX11 \ src \ Tensor \ TensorRef.h 49

1 个答案:

答案 0 :(得分:1)

对于Tensor操作,您不能混合使用不同的IndexType(即Tensor的隐式第4个模板参数)。这也意味着std::array的类型必须与IndexType匹配。默认情况下,Eigen::Tensor使用Eigen::DenseIndex,与Eigen::Index相同。您可以写这个代替Eigen::Tensor<int,4>(与Tensor<int,2>类似)

Eigen::Tensor<int, 4, 0, int>

,或者将std::array<int, 2>替换为std::array<Eigen::Index, 2>。 当然,为两者同时使用typedef可以使您打字安全,并且在需要时可以简化重构。