Je me demandais s'il y a un bon moyen de tester deux MATRICES EIGEN Pour approximatif em> égalité en utilisant Google Test ou Prenez le cas de test suivant comme exemple simplifié: je multiplie deux matrices de valeur complexes A code> et B code> et attendez-vous à un certain résultat
c_expect code>. Je calcule le résultat numérique
c_actual = A * b code>, utilisant Eigen. Maintenant, je veux comparer
c_expect code> et
c_actual code>. En ce moment, les regards de code correspondant à ceci: p>
EXPECT_THAT(C_actual, ElementsAreArray(C_expect));
// or
EXPECT_THAT(C_actual, Pointwise(MyComplexNear(1e-7), C_expect));
3 Réponses :
Une solution simplifiée serait de comparer la norme de la différence avec certains epsilon, c'est-à-dire dans un espace vectoriel || X - y || == 0 si et seulement si x == y, et la norme est toujours non négative (réelle). De cette façon, vous n'aurez pas à faire manuellement la boucle et à comparer l'élément-sage (bien sûr, la norme effectuera plus de calculs en arrière-plan que de simples comparaisons sages d'éléments) p> ps: le Matrix :: Norm () Code> Mises en œuvre dans Eigen est la norme Frobenius, qui est calculée très rapide pour évaluer, voir http://mathworld.wolfram.com/frobeniusnorm.html p> p>
Merci pour votre réponse. Oui, j'ai oublié de mentionner celui-ci. Dans mon cas, il serait assez important de savoir à quel composant est l'une fauchne. C'est pourquoi je imprime le i code>,
j code> indices dans mon code exemple.
Vous pouvez obtenir un pointeur brut sur les données, matrixxcd :: data () code>, puis l'utiliser pour itérer jusqu'à
matrixxcd :: Taille () code>, je ne peux penser à aucun Autre façon. De cette façon, vous comparez 2 matrices complexes.
Comme mentionné dans ma question. Cette approche vous mettra en difficulté si l'ordre de stockage diffère.
Mais vous pouvez tester pour l'ordre de stockage, je pense qu'il y a quelque chose comme Isrowmajor code> ... Bien sûr, pour un ordre de stockage général, vous avez mal de chance et doit probablement définir votre propre cartographie entre index dans le tableau et les correspondants dans la matrice. Peut-être utiliser
mappe code> pour modifier l'ordre de stockage à l'exécution, puis obtenir les données
() code>? eigen.tuxfamily.org/dox/group__TutorialMapclass.html
Hmm, je ne pense pas que mappe code> peut être utilisé de cette façon. Cela forcerait simplement un ordre de stockage différent sur la matrice, ce qui serait comme la transposition dans mon cas. Mais, je pense que je pourrais appliquer un certain ordre de stockage en copiant dans une matrice avec l'ordre de stockage attendu.
Pourquoi ne pas utiliser le La documentation de ces fonctions ci-dessus est disponible ici P>
Donc pour la plupart des cas iSapprox code> ou
ismuchsmallerthan code> fonctions membres des types de matrice d'Eigen? P>
ASSERT_TRUE (C_ACTUAL.ISAPROX (C_EXPECTPECTOCLE); CODE> est ce dont vous avez besoin. Vous pouvez également fournir un paramètre de précision comme deuxième argument à Isapprox . P>
Merci pour votre réponse. Oui, dans certains cas, ce serait une bonne alternative. Malheureusement, dans certains cas, j'aurais besoin de savoir quel composant est l'incrusté. Mais, pour chaque fois que ce n'est pas le cas, ce qui précède est une bonne solution.
Utilisation de Matcher_P2 Il est en fait possible de tourner ISapprox code> dans une correspondance Gmock. L'impression des objets Eigen pose un problème, car le Google a décidé que ce serait une bonne idée de défaut à un hex-vidage s'il n'y a pas Explicit i> surcharge sur
Opérateur <<< / Code> ou
printTo code>. Donc, l'opérateur
modélisé <<< / code> Inside Eigen ne compte pas. Par conséquent, vous devrez fournir une surcharge pour chaque type Eigen. Mais c'est un problème différent ...
J'ai posté une autre question sur le printto code> problème ici .
Sous C ++ 11 Utilisation d'une lambda fonctionne bien mais semble non estimée: p> attendre_pred2 code> de Googletest peut être utilisé pour cela.
bool MatrixEquality(const MatrixXf &lhs, const MatrixXf &rhs) {
return lhs.isApprox(rhs, 1e-4);
}
TEST(Eigen, MatrixMultiplication) {
...
ASSERT_PRED2(MatrixEquality, C_expected, C_actual);
}