Comment puis-je comparer tous les éléments des deux tableaux?
J'ai deux grands tableaux avec environ 1000 lignes et 1000 colonnes. J'ai besoin de comparer chaque élément de ces tableaux et de stocker des 1 dans un autre tableau si les éléments correspondants sont égaux.
Je peux le faire avec des boucles, mais qui prend du temps. Comment puis-je faire cela au plus vite?
Toujours, toujours vectoriser code MATLAB lorsque cela est possible.
Devrait être déplacé vers la math.stackexchange.com?
Devrait être déplacé vers la math.stackexchange.com?
OriginalL'auteur anon | 2010-02-04
Vous devez vous connecter pour publier un commentaire.
Les réponses données sont correctes. Je voulais juste de donner des précisions sur gnovice de l' une remarque sur la virgule flottante tests.
Lorsque l'on compare les nombres à virgule flottante pour l'égalité, il est nécessaire d'utiliser une valeur de tolérance. Deux types de tolérance comparaisons sont couramment utilisées: la tolérance absolue et relative tolérance. (source)
Une tolérance absolue comparaison de
a
etb
ressemble:Une relative comparaison de la tolérance ressemble:
Vous pouvez mettre en œuvre les deux ci-dessus que les fonctions anonymes:
Puis vous pouvez les utiliser comme:
isequal
?essayez:
isequal(0.3,0.1*3)
qui est équivalent à0.3 == 0.1*3
. La réponse est faux!Mes excuses, je suppose que ma foi en MATLAB a été égaré! Je vais devoir changer beaucoup de code maintenant 🙁
Un point sur l'utilisation de l'EPS: c'est aussi un relative de la fonction. L'appel de l'EPS sans argument vous donne la distance de 1,0 pour le prochain plus grand nombre double précision. Pour votre deuxième fonction anonyme, vous auriez probablement souhaitez utiliser quelque chose comme
tol*eps(max(abs(x),abs(y)))
, qui devrait vous donner de la virgule flottante de précision dans la gamme des valeurs dansx
ety
(multiplié partol
).En fait c'est incorrect. si vous suivez le lien que j'ai référencé (partie de la documentation de MATLAB xUnit cadre), il explique que le
tol_floor
valeur agit que d'une tolérance absolue quanda
etb
sont très proches de 0. J'ai juste choisi d'utilisereps
. Comme une question de fait, vous pouvez l'omettre si vous le souhaitez et de définir comme:abs(x-y) <= tol*max(abs(x),abs(y))
où l'utilisateur choisit une valeur pourtol
(une bonne valeur par défaut est1e-8
)OriginalL'auteur Amro
Si vos deux matrices
A
etB
sont de la même taille, alors vous pouvez faire ceci:et
index
sera un ensemble logique avec partout un élément deA
etB
sont à égalité, et zéro sinon.Un mot d'avertissement...
Si
A
etB
contenir des entiers, le dessus doit être bien. Toutefois, si elles contiennent des valeurs à virgule flottante, vous pouvez obtenir des résultats inattendus. Le code ci-dessus ne disposons que des valeurs de l'un pour les éléments qui sont exactement l'égalité. Même la plus petite différence de provoquer les éléments à prendre en considération l'inégalité.Vous pouvez regarder cette question des réponses pour plus d'informations sur la façon de traiter avec les "dangers des opérations en virgule flottante". Une solution serait de vérifier que les éléments du tableau sont à l'intérieur d'une tolérance de l'un à l'autre, comme suit:
Ci-dessus vous donnera un ensemble logique
index
avec partout les éléments deA
etB
sont dans 0.0001 uns des autres, et zéro sinon.eps est la plus petite valeur qui peut être représentée, n'est-ce pas? Ce n'est pas très utile dans ce contexte.
OriginalL'auteur gnovice
Suffit d'utiliser la normale
==
opérateur:OriginalL'auteur Thomas