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

How to get the scalar value returned by eigen tensor's sqrt() function

本文关键字:函数 sqrt 标量 返回 特征 何获取 获取 张量      更新时间:2023-10-16
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 大小相同的张量,这显示在最后两行代码中。不幸的是,关于特征张量常量函数中不匹配的C++类型存在一些错误,因为常量所需的参数类型是scalar(int,float)。所以问题是我如何获得参数linear_square_sum的标量值。如果有人教我如何更改最后两行代码,我将不胜感激。

如果您查看"常见陷阱"下的特征文档,您将看到为什么特征表达式模板样式类型不能很好地与auto混合的解释。
因此,您应该明确拼写出类型。

但实际问题可能是linear_square_sum是一个"0 维张量",根据文档,它是标量的有效复制。但它与显式声明为浮点数的标量类型的linear不匹配。

您可以使用不接受参数的operator()重载访问"0 维张量"的底层标量。所以这是一个可能的解决方案。

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]