有这个:
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支持。
答案 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。