if
中的条件应该是布尔类型,但是我只能得到compare
的本征张量表达式。因此,它出了编译时的错误。我的问题是如何修改以下代码以使if
条件合法。
Eigen::Tensor<float, 1> linear(2);
linear.setValues({3,4});
auto linear_square = (linear * linear).sum().sqrt(); // linear_square: 5
auto compare = (linear_square>linear_square.constant(4));
if(compare) // bug: compare cannot be converted to bool
std::cout<<"hahaha"<<std::endl;
答案 0 :(得分:3)
主要问题是您使用了关键字auto
,该关键字对Eigen的作用出乎意料。
张量运算的输出基本上不是张量,而是运算,即有关如何组合张量的配方。当您将此值(运算)分配给张量时,将触发计算。因此,您需要将张量用作操作输出的类型,以触发计算。
文档比我更精确:https://eigen.tuxfamily.org/dox-devel/unsupported/eigen_tensors.html,我引用(强调我的意思):
由于Tensor操作创建张量运算符,因此C ++
auto
关键字没有直观的含义。考虑这两行 代码:Tensor<float, 3> t3 = t1 + t2; auto t4 = t1 + t2;
在第一行中,我们分配张量
t3
,它将包含t1
和t2
相加的结果。在第二行中,t4
是 实际上是张量运算符的树,用于计算加法t1
和t2
中的第一个。实际上,t4
不是张量,并且您无法获得 其元素的值:Tensor<float, 3> t3 = t1 + t2; cout << t3(0, 0, 0); // OK prints the value of t1(0, 0, 0) + t2(0, 0, 0) auto t4 = t1 + t2; cout << t4(0, 0, 0); // Compilation error!
所以我避免使用auto
,而是使用等级0的张量(文档告诉我sum()
返回等级0的张量)。这触发了计算,使compare
成为实张量。该代码将编译并按预期运行:
#include <iostream>
#include <unsupported/Eigen/CXX11/Tensor>
int main()
{
Eigen::Tensor<float, 1> linear{2};
linear.setValues({ 3,4 });
//Here you can use auto because you do not try to get data out of this element, I am making explicit the dimensionality
Eigen::Tensor<float, 0> linear_square = (linear * linear).sum().sqrt(); // linear_square: 5
//Here you need conversion to Tensor
Eigen::Tensor<bool, 0> compare = linear_square > linear_square.constant(4);
if (compare(0))
std::cout << "hahaha" << std::endl;
else
std::cout << "no" << std::endl;
}
我使用MSVC 2019进行编译,并使用了Eigen 3.3.3(NuGet中可用的那个)