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 1 dans un autre tableau si les éléments correspondants sont égaux.
Je peux le faire avec des boucles for mais cela prend beaucoup de temps. Comment puis-je faire cela plus rapidement?
Les réponses données sont toutes correctes. Je voulais juste développer gnovice's remarque sur les tests en virgule flottante.
Lors de la comparaison des nombres à virgule flottante pour l'égalité, il est nécessaire d'utiliser une valeur de tolérance. Deux types de comparaisons de tolérance sont couramment utilisés: la tolérance absolue et la tolérance relative. ( source )
Une comparaison de tolérance absolue de a
et b
ressemble à:
|a-b| < tol
Une comparaison de tolérance relative ressemble à ceci:
|a-b| < tol*max(|a|,|b|) + tol_floor
Vous pouvez implémenter les deux ci-dessus en tant que fonctions anonymes:
%# absolute tolerance equality
isequalAbs = @(x,y,tol) ( abs(x-y) <= tol );
%# relative tolerance equality
isequalRel = @(x,y,tol) ( abs(x-y) <= ( tol*max(abs(x),abs(y)) + eps) );
Ensuite, vous pouvez les utiliser comme:
%# let x and y be scalars/vectors/matrices of same size
x == y
isequalAbs(x, y, 1e-6)
isequalRel(x, y, 1e-6)
Si vos deux matrices A
et B
sont de la même taille, vous pouvez le faire:
index = A == B;
et index
sera un tableau logique avec ceux partout un élément de A
et B
sont égaux et zéro sinon.
Un mot d'avertissement ...
Si A
et B
contiennent des entiers, ce qui précède devrait convenir. Cependant, s'ils contiennent des valeurs à virgule flottante, vous pouvez obtenir des résultats indésirables. Le code ci-dessus n'aura des valeurs de un que pour les éléments qui sont exactement égaux. Même la plus petite différence fera que les éléments seront considérés comme inégaux.
Vous pouvez consulter réponses à cette question pour plus d'informations sur la gestion des "périls des opérations en virgule flottante". Une solution serait de vérifier que les éléments du tableau sont dans une tolérance donnée les uns des autres, comme ceci:
tolerance = 0.0001;
index = abs(A-B) <= tolerance;
Ce qui précède vous donnera un tableau logique index
avec ceux partout les éléments de A
et B
sont à 0,0001 l'un de l'autre et zéro sinon.
Utilisez simplement le ==
opérateur:
>> [1 2; 3 4] == [1 5; 6 4]
ans =
1 0
0 1