如何获取本征张量的sqrt()函数返回的标量值

时间:2019-07-16 12:18:53

标签: c++ eigen tensor sqrt

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的标量值。如果有人教我如何更改最后两行代码,我将不胜感激。

1 个答案:

答案 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]