2010-11-04 3 views
4

J'ai du code Matlab qui vérifie si un tableau est différent de zéro avant de fonctionner et qu'il est ignoré même si le tableau est de 3 par 1000+.Pourquoi un tableau Matlab complet (X) renvoie-t-il un faux dans 'if X'?

Le code est juste: si X

Le tableau est lu à partir d'un fichier Excel à l'aide « xlsread » et ne donne que l'erreur d'un fichier de données en particulier, mais fonctionne pour tout autre fichier de données d'entrée que j'utilise.

Une idée pourquoi tout cela est-il?

Répondre

3

Il ne prend un élément d'un tableau à valeur nulle pour ce test à l'échec

>> A = rand(100, 3) + 1; 
>> if A; disp('True'); else disp('False'); end 
True  

>> A(35) = 0; 
>> if A; disp('True'); else disp('False'); end 
False 

Si vous cherchez à vérifier que le tableau ne contient pas seulement des zéros, vous pouvez utiliser la any mot-clé:

>> A = rand(100, 3) + 1; 
>> A(35) = 0; 
>> if any(A(:)); disp('True'); else disp('False'); end 
True 

>> A = 0 * A; 
>> if any(A(:)); disp('True'); else disp('False'); end 
False 

Edit:

Toutes mes excuses, comme SCFrench mentionne dans les commentaires, utilisez any(A(:)) pour tester chaque élément dans un tableau plutôt que any(A) - ceci a été dûment édité dans ma réponse ci-dessus.

+1

Utilisez n'importe quel (A (:)) pour éviter le problème que b3 mentionne dans sa réponse. – SCFrench

+0

Merci, ça l'a corrigé. Je suis surpris qu'il ait fallu si longtemps pour que ce bug apparaisse. – Matt

0

La fonction any ne fonctionne pas tout à fait à ce problème car il traite les colonnes d'une matrice en tant que vecteurs:

>> any([0 0 1; 0 0 1; 0 0 1]) 
ans = 
    0  0  1 

Au lieu de cela, utilisez la fonction nnz pour compter le nombre d'éléments non nuls dans un matrice:

>> nnz([0 0 1; 0 0 1; 0 0 1]) 
ans = 
    3 
>> nnz([0 0 0; 0 0 0; 0 0 0]) 
ans = 
    0 
Questions connexes