J'ai deux matrices x et y, les deux sont des résultats de différents algorithmes/routines qui sont supposés calculer le même résultat. Bien que je sache que isequal() vérifierait si x et y sont la même matrice, les entrées dans ces matrices ne seraient pas exactement les mêmes (c'est-à-dire que certaines entrées pourraient être avec 5% de réduction dans le pire des cas). Dans ce scénario, quelle serait la meilleure méthode de comparaison pour voir si elles sont assez proches pour être considérées comme le même résultat? Merci d'avance pour les conseils.Comparaison de deux matrices dans Matlab
Répondre
Modification solution Edric's:
absTol = 1e-3; % You choose this value to be what you want!
relTol = 0.05; % This one too!
absError = x(:)-y(:);
relError = absError./x(:);
relError(~isfinite(relError)) = 0; % Sets Inf and NaN to 0
same = all((abs(absError) < absTol) & (abs(relError) < relTol));
Le variable même sera faux si soit l'absolu ou l'erreur relative d'un élément est plus grande que les tolérances que vous choisissez. En outre, si des éléments de x se trouvent exactement à 0, alors certains des éléments de relError pourraient finir par être infinis ou non-nombre, donc j'ai utilisé la fonction ISFINITE pour ignorer ces valeurs en les réglant
Je ne suggérerais pas d'utiliser IMAGESC pour comparer des graphiques, puisque 1) les données sont mises à l'échelle lorsqu'elles sont affichées, 2) la carte de couleurs pour l'affichage a un nombre discret de valeurs de couleur (ce qui est 256 par défaut, donc beaucoup d'arrondis), et 3) de subtiles variations de couleur peuvent ne pas être si évidentes à partir de la comparaison visuelle de deux parcelles.
Essayez ceci:
tf = abs((A-B)./B)<0.05
Ceci renvoie une matrice logique qui est vrai pour chaque élément si la différence relative entre A et B par rapport à B est inférieur à 5 pour cent.
Si vous voulez demander si tous ces éléments sont vraies (tous satisfaire à la condition ci-dessus):
all(tf(:))
je considère faire quelque chose comme ceci avec une tolérance absolue ainsi qu'une tolérance relative:
function same = tol(x, y)
absTol = 1e-3;
relTol = 0.05;
errVec = abs(x(:) - y(:));
same = all((errVec < absTol) | (errVec./x(:) < relTol));
J'ai essayé la méthode d'Edric et d'Andrew.Même si j'ai une sortie de la fonction étant fausse, quand j'ai comparé les deux résultats visuellement en les traçant en utilisant la fonction imagesc(), ils ont l'air très similaires. Par conséquent, je ne suis toujours pas sûr de ce qu'il faut en faire. – stanigator
Lorsque vous avez de très petites paires de valeurs en x et y, le résultat retournerait 0 même si les valeurs sont ignorable elles-mêmes. Ainsi, un ajout à la solution acceptée
relError(x < absTol) = 0;
pourrait être utilisé pour rejeter de très petites erreurs. Ainsi, l'erreur relative n'est pas prise en compte pour ces valeurs.
faire usage de « IsEqual (a, b) où a et b sont deux matrices, le cas 1, il est vrai
Notez que op précise que isequal ne fonctionnerait pas car il y a une erreur. –
pour les matrices X et Y contenant des valeurs en virgule flottante, on peut vérifier si les éléments de matrice sont à une tolérance donnée les uns aux autres. Exemple de code:
tol = 0.05;
result = abs(x - y) <= tol;
- 1. matrices multiples dans Matlab sans récursion
- 2. Comparaison de deux objets.
- 3. Performances d'échange de deux éléments dans MATLAB
- 4. Matrices de matrices en Perl
- 5. Combine deux matrices sur une touche?
- 6. Problème dans la comparaison de deux chaînes ...!
- 7. Comparaison de deux collections d'objets
- 8. deux dates Comparaison mysql
- 9. Comparaison de deux schémas XML
- 10. NumPy: Comparaison d'éléments dans deux tableaux
- 11. Binning dans matlab
- 12. Ms Access Comparaison de deux jeux d'enregistrements
- 13. Matrices limitées dans Ruby
- 14. Date de comparaison entre deux dates?
- 15. Comparaison de la structure de dossiers dans deux environnements
- 16. Comparaison de deux fichiers xml dans Objective-C
- 17. Matrices en Python
- 18. Ajout de matrices en C#?
- 19. Comparaison de deux tables de base de données
- 20. Déclencheurs DAQ dans Matlab
- 21. Subsonic: Comparaison de deux colonnes au lieu d'un paramètre d'entrée
- 22. Matrices Rotation & OpenGL
- 23. comparaison/intersection des critères de comparaison
- 24. types numériques d'erreur lors de la multiplication de deux 2 vecteurs dans Matlab
- 25. Comment connecter une courbe de longueur fixe entre deux points dans l'espace à l'aide de Matlab?
- 26. Java: Comparaison de deux tableaux de chaînes et suppression des éléments qui existent dans les deux tableaux
- 27. critères d'information pour les matrices de confusion
- 28. SWIG Lua et matrices de passage
- 29. Problème de comparaison Oracle
- 30. comparaison de schéma db
Cette question est assez vieux, mais mathématiquement vous voulez utiliser 'norme (A-B)/norme (A)', pas les solutions ci-dessous. – rlbond