web-dev-qa-db-fra.com

Fonction pour 'la matrice contient-elle la valeur X?'

Existe-t-il une fonction MATLAB intégrée permettant de déterminer si une matrice contient une certaine valeur? (comme PHP in_array())

69
zenna

De nombreuses façons de faire cela. Un membre est le premier qui me vienne à l’esprit, car c’est une action que vous souhaitez entreprendre en tant que membre. Ainsi

X = primes(20);
ismember([15 17],X)
ans =
      0    1

Étant donné que 15 n’est pas primordial, mais 17 ans, c’est un membre qui a bien fait son travail ici.

Bien sûr, trouver (ou tout autre) fonctionnera également. Mais ceux-ci ne sont pas vectorisés au sens où l’était membre. Nous pouvons tester pour voir si 15 est dans l'ensemble représenté par X, mais pour tester ces deux nombres, il faudra une boucle, ou des tests successifs.

~isempty(find(X == 15))
~isempty(find(X == 17))

ou,

any(X == 15)
any(X == 17)

Enfin, je ferai remarquer que les tests de valeurs exactes sont dangereux si les nombres peuvent être vrais. Les tests sur les valeurs entières, comme je l’ai montré, sont faciles. Mais les tests sur les nombres en virgule flottante doivent généralement utiliser une tolérance.

tol = 10*eps;
any(abs(X - 3.1415926535897932384) <= tol)
99
user85109

tu peux faire:

A = randi(10, [3 4]);      %# a random matrix
any( A(:)==5 )             %# does A contain 5?

Pour faire ce qui précède de manière vectorisée , utilisez:

any( bsxfun(@eq, A(:), [5 7 11] )

ou comme @ woodchips suggère:

ismember([5 7 11], A)
11
Amro

Si vous devez vérifier si les éléments d'un vecteur sont dans un autre, la meilleure solution est ismember comme indiqué dans les autres réponses.

ismember([15 17],primes(20))

Cependant, lorsque vous avez affaire à des nombres à virgule flottante, ou que vous voulez simplement avoir des correspondances proches (+ - 1000 est également possible), la meilleure solution que j'ai trouvée est la solution assez efficace File Exchange Submission: ismemberf

Cela donne un exemple très pratique:

[tf, loc]=ismember(0.3, 0:0.1:1) % returns false 
[tf, loc]=ismemberf(0.3, 0:0.1:1) % returns true

Bien que la tolérance par défaut devrait normalement être suffisante, elle vous donne plus de flexibilité

ismemberf(9.99, 0:10:100) % returns false
ismemberf(9.99, 0:10:100,'tol',0.05) % returns true
3
Dennis Jaheruddin

Pour les données en virgule flottante, vous pouvez utiliser la nouvelle fonction ismembertol , qui calcule l’appartenance à un ensemble avec une tolérance spécifiée . Cette fonction est similaire à la fonction ismemberf trouvée dans l'échange de fichiers, à l'exception du fait qu'elle est désormais intégrée à MATLAB. Exemple:

>> pi_estimate = 3.14159;
>> abs(pi_estimate - pi)
ans =
   5.3590e-08
>> tol = 1e-7;
>> ismembertol(pi,pi_estimate,tol)
ans =
     1
2
chappjc