我从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
答案 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
可以使您打字安全,并且在需要时可以简化重构。