10
votes

Comparez les matrices Eigen dans Google Test ou Google Mock

Je me demandais s'il y a un bon moyen de tester deux MATRICES EIGEN Pour approximatif em> égalité en utilisant Google Test ou Google Mock .

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));


0 commentaires

3 Réponses :


3
votes

Une solution simplifiée serait de comparer la norme de la différence avec certains epsilon, c'est-à-dire xxx

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)

ps: le Matrix :: Norm () 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


5 commentaires

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 , j indices dans mon code exemple.


Vous pouvez obtenir un pointeur brut sur les données, matrixxcd :: data () , puis l'utiliser pour itérer jusqu'à matrixxcd :: Taille () , 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 ... 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 pour modifier l'ordre de stockage à l'exécution, puis obtenir les données () ? eigen.tuxfamily.org/dox/group__TutorialMapclass.html


Hmm, je ne pense pas que mappe 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.



17
votes

Pourquoi ne pas utiliser le iSapprox ou ismuchsmallerthan fonctions membres des types de matrice d'Eigen?

La documentation de ces fonctions ci-dessus est disponible ici

Donc pour la plupart des cas ASSERT_TRUE (C_ACTUAL.ISAPROX (C_EXPECTPECTOCLE); est ce dont vous avez besoin. Vous pouvez également fournir un paramètre de précision comme deuxième argument à Isapprox .


3 commentaires

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 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 surcharge sur Opérateur <<< / Code> ou printTo . 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 problème ici .



5
votes

attendre_pred2 code> de Googletest peut être utilisé pour cela.

Sous C ++ 11 Utilisation d'une lambda fonctionne bien mais semble non estimée: p>

bool MatrixEquality(const MatrixXf &lhs, const MatrixXf &rhs) {
  return lhs.isApprox(rhs, 1e-4);
}

TEST(Eigen, MatrixMultiplication) {
  ...

  ASSERT_PRED2(MatrixEquality, C_expected, C_actual);
}


0 commentaires