如何使特征张量值作为“ if”条件表达式

时间:2019-08-10 06:09:12

标签: c++ eigen tensor

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;

1 个答案:

答案 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,它将包含   t1t2相加的结果。在第二行中,t4是   实际上是张量运算符的树,用于计算加法   t1t2中的第一个。实际上,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中可用的那个)