如何比较两个张量在Eigen中是否相等?

时间:2016-11-14 21:15:36

标签: c++ eigen

有这个:

https://codeyarns.com/2016/02/16/how-to-compare-eigen-matrices-for-equality/

但是张贴没有isApprox。

以下不符合我的要求:

#include <Eigen/Core>
#include <unsupported/Eigen/CXX11/Tensor>
#include <array>
#include <iostream>

using namespace Eigen;
using namespace std;

int main()
{
// Create 2 matrices using tensors of rank 2
Eigen::Tensor<int, 2> a(2, 3);
Eigen::Tensor<int, 2>* b = &a;

cerr<<(*b==*b)<<endl;
}

因为它确实进行了协调比较,并返回相同维度的张量而不是真/假谷值。

如何检查两个张量是否相同?没有isApprox的张量。

我可以编写自己的函数,但我希望能够在可用时使用GPU电源,看起来Eigen内置了GPU支持。

2 个答案:

答案 0 :(得分:3)

对于2个张量A和B的精确比较,您可以使用比较运算符,然后使用布尔减少: Tensor<bool, 0> eq = (A==B).all();

这将返回一个等级0(即标量)的张量,其包含一个布尔值,如果A的每个系数等于B的相应系数,则该值为真。

目前没有近似的比较,尽管添加起来并不困难。

答案 1 :(得分:0)

您始终可以使用几个Eigen::Map来执行isApprox检查。

#include <iostream>
#include <unsupported/Eigen/CXX11/Tensor>

using namespace Eigen;

int main()
{

    Tensor<double, 3> t(2, 3, 4);
    Tensor<double, 3> r(2, 3, 4);

    t.setConstant(2.1);
    r.setConstant(2.1);
    t(1, 2, 3) = 2.2;
    std::cout << "Size: " << r.size() << "\n";
    std::cout << "t: " << t << "\n";
    std::cout << "r: " << r << "\n";

    Map<VectorXd> mt(t.data(), t.size());
    Map<VectorXd> mr(r.data(), r.size());

    std::cout << "Default isApprox: " << mt.isApprox(mr) << "\n";
    std::cout << "Coarse isApprox: " << mt.isApprox(mr, 0.11) << "\n";

    return 0;
}

P.S./N.B。 关于Eigen内置的GPU支持......最后我检查它是相当有限的,有充分的理由。它仅限于固定大小的矩阵,因为GPU上的动态分配确实是你想要避免的,就像普通感冒一样(如果不是像瘟疫一样)。我把它拿回来。看起来Tensor模块很好地支持GPU。