Eigen::Tensor<float, 1> linear(2);
linear.setValues({3,4});
auto linear_square = linear * linear;
auto linear_square_sum = linear_square.sum().sqrt();
std::cout<<linear_square_sum<<std::endl; // 5
auto new_linear = linear.constant(linear_square_sum);
std::cout<<new_linear<<std::endl; // expected: [5,5]
linear_square_sum
的期望值为5。现在的目标是创建一个与linear
大小相同的张量,该张量在最后两行代码中显示。不幸的是,由于所需的常量参数类型为scalar(int,float)
,因此在Eigen张量常量函数中存在一些与不匹配的C ++类型有关的错误。因此,问题是如何获得参数linear_square_sum
的标量值。如果有人教我如何更改最后两行代码,我将不胜感激。
答案 0 :(得分:2)
如果您查看"Common Pitfalls"下的Eigen文档,则会看到有关为什么Eigen Expression-Template样式类型与auto
不能很好地结合的解释。
因此,您应该明确说明类型。
但是实际问题可能是linear_square_sum是“ 0维张量”,根据文档,这是标量的有效表示。但是它与明确声明为float的linear
的标量类型不匹配。
您可以使用不带参数的operator()
重载来访问“ 0维Tensor”的基础标量。因此,这是一种可能的解决方案。
using FTensor1 = Eigen::Tensor<float, 1>;
using FTensor0 = Eigen::Tensor<float, 0>;
FTensor1 linear(2);
linear.setValues({3,4});
FTensor1 linear_square = linear * linear;
FTensor0 linear_square_sum = linear_square.sum().sqrt();
std::cout<<linear_square_sum<<std::endl; // 5
auto new_linear = linear.constant(linear_square_sum());
std::cout<<new_linear<<std::endl; // expected: [5,5]