2009-08-13 5 views
3

Matlab quand on essaie d'accéder à un élément d'une matrice qui n'existe généralement pas une erreur est élevée:Est-il possible de fournir une valeur par défaut pour l'indexation dans Matlab?

>> month(0) 
??? Subscript indices must either be real positive integers or logicals. 

Je me demandais s'il y a une fonction qui permet de fournir la valeur par défaut dans de tels cas. Exemple:

>> get_def(month(0), NaN) 
ans = 
    NaN 

P.S. Je peux contourner ce cas particulier de l'indice (0), mais je m'interrogeais sur la façon plus générique de le faire.

Répondre

2

Il n'y a pas de fonction MATLAB intégrée pour faire ce que vous voulez. Vous pouvez utiliser un try-catch bloc:

>> try a = month(0); catch a = nan; end 
>> a 

a = 

    NaN 

Cependant, la meilleure option serait probablement à vérifier l'erreur l'indice premier, lancer une erreur ou définir une variable à une valeur par défaut si elle est hors de gamme.

Si vous voulez vraiment essayer d'utiliser un index qui peut être 0, vous pouvez écrire votre propre fonction get_def. Voici une façon de le faire:

function value = get_def(vector,index,defaultValue) 
    try 
    value = vector(index); 
    catch 
    value = defaultValue; 
    end 
end 

Vous pouvez ensuite utiliser cette fonction de la manière suivante:

>> month = 1:12; 
>> get_def(month,0,nan) 

ans = 

    NaN 

>> get_def(month,1,nan) 

ans = 

    1 
+2

Je suis juste commenter dire que je l'aime l'icône. Yay QOTSA! –

+0

@Matt: Merci! Vous n'êtes que la deuxième personne à remarquer/mentionner. – gnovice

+1

Je viens juste d'écouter un album QOTSA en direct quand je suis tombé dessus. Merci d'avoir complété l'image sensorielle. –

3

Une solution élégante serait de créer une sous-classe de la classe builtin à double de Matlab et surcharger la méthode de subsref:

classdef myDouble < double 

    methods 

     function obj = myDouble(val) 
      obj = [email protected](val); 
     end 

     function val = subsref(obj, S) 
      try 
       val = [email protected](obj, S); 
      catch 
       val = NaN; 
      end 
     end 

    end 

end 

Vous pouvez ensuite utiliser cette classe comme suit :

>> a = myDouble(1:10); 
>> a(1:3) 

ans = 
    myDouble 
    double data: 
    1  2  3 

    Methods, Superclasses 

>> a('asdsa') 

ans = 
    NaN 

>> a({1, 'asdf'}) 

ans = 
    NaN 

Depuis la sous-classe hérite de la classe à double, vous obtenez toujours toutes les fonctionnalités de la à double classe et la fonctionnalité ajoutée de votre commande myDouble classe.

Consultez l'aide sur Matlab:

+0

+1: J'ai effectivement envisagé de faire cette suggestion, mais j'ai pensé que cela pourrait être un peu plus complexe que ce que le PO recherchait. – gnovice

+2

J'espère que le PO est encouragé à explorer les classes MATLAB. Vous avez raison de dire que cela peut être plus complexe au départ, mais la résolution de problèmes peut devenir beaucoup plus facile même avec la compréhension des concepts de POO par un débutant. Bien sûr, utilisé de façon inappropriée, les programmes peuvent aussi devenir Rube Goldberg-ian! –

Questions connexes