131 votes

Comment définir des valeurs par défaut pour les paramètres des fonctions dans MATLAB ?

Est-il possible d'avoir des arguments par défaut dans MATLAB ?

Par exemple, ici :

function wave(a, b, n, k, T, f, flag, fTrue=inline('0'))

J'aimerais que la solution réelle soit un argument facultatif de la fonction d'onde. Si c'est possible, quelle est la bonne façon de procéder ?

Actuellement, j'essaie ce que j'ai posté ci-dessus et j'obtiens :

??? Error: File: wave.m Line: 1 Column: 37
The expression to the left of the equals sign is not a valid target for an assignment.

156voto

simon Points 5346

Il n'y a pas de moyen direct de le faire comme vous l'avez tenté.

L'approche habituelle consiste à utiliser "varargs" et à vérifier le nombre d'arguments. Quelque chose comme :

function f(arg1, arg2, arg3)

  if nargin < 3
    arg3 =   'some default'
  end

end

Il y a quelques trucs plus fantaisistes que vous pouvez faire avec isempty Vous pouvez également consulter la centrale MATLAB pour trouver des paquets qui regroupent ce genre de choses.

Vous pouvez consulter varargin , nargchk etc. Ce sont des fonctions utiles pour ce genre de choses. varargs vous permettent de laisser un nombre variable d'arguments finaux, mais cela ne vous permet pas de contourner le problème des valeurs par défaut pour certains/toutes ces arguments.

58voto

Matt Points 381

J'ai utilisé le inputParser pour traiter de la définition des options par défaut. MATLAB n'acceptera pas le format de type Python que vous avez spécifié dans la question, mais vous devriez être en mesure d'appeler la fonction comme ceci :

wave(a, b, n, k, T, f, flag, 'fTrue', inline('0'))

Après avoir défini le wave comme ceci :

function wave(a, b, n, k, T, f, flag, varargin)

    i_p = inputParser;
    i_p.FunctionName = 'WAVE';

    i_p.addRequired('a', @isnumeric);
    i_p.addRequired('b', @isnumeric);
    i_p.addRequired('n', @isnumeric);
    i_p.addRequired('k', @isnumeric);
    i_p.addRequired('T', @isnumeric);
    i_p.addRequired('f', @isnumeric);
    i_p.addRequired('flag', @isnumeric);
    i_p.addOptional('ftrue', inline('0'), 1);

    i_p.parse(a, b, n, k, T, f, flag, varargin{:});

Maintenant, les valeurs passées dans la fonction sont disponibles par l'intermédiaire de i_p.Results . De plus, je n'étais pas sûr de savoir comment valider que le paramètre passé pour ftrue était en fait un inline donc j'ai laissé le validateur vide.

7 votes

D'après ce que je sais, este est la méthode préférée. C'est propre, auto-documenté (plus qu'un tas d'outils de gestion de l'information). if nargin statemens), facile à entretenir, compact et flexible.

19voto

Peter Points 71

Une autre méthode un peu moins compliquée est

function output = fun(input)
   if ~exist('input','var'), input='BlahBlahBlah'; end
   ...
end

0 votes

Cette option ne fonctionne pas si vous comptez utiliser MATLAB Coder pour générer du code C, car Coder ne prend pas en charge la fonction "exist".

10voto

Oui, ce serait vraiment bien d'avoir la possibilité de faire ce que vous avez écrit. Mais cela n'est pas possible dans MATLAB. La plupart de mes utilitaires qui autorisent des valeurs par défaut pour les arguments ont tendance à être écrits avec des vérifications explicites au début, comme ceci :

if (nargin<3) or isempty(myParameterName)
  MyParameterName = defaultValue;
elseif (.... tests for non-validity of the value actually provided ...)
  error('The sky is falling!')
end

Ok, donc j'appliquerais généralement un message d'erreur meilleur et plus descriptif. Voyez que la vérification d'une variable vide permet à l'utilisateur de passer dans une paire de parenthèses vides, [] comme substitut d'une variable qui prendra sa valeur par défaut. L'auteur doit néanmoins fournir le code permettant de remplacer cet argument vide par sa valeur par défaut.

Mes utilitaires qui sont plus sophistiqués, avec beaucoup de qui ont tous des arguments par défaut, utiliseront souvent une interface de paire propriété/valeur pour les arguments par défaut. On retrouve ce paradigme de base dans les outils graphiques de poignée de MATLAB, ainsi que dans optimset, odeset, etc.

Pour travailler avec ces paires de propriétés/valeurs, vous devez connaître les éléments suivants varargin comme un moyen d'entrer un nombre entièrement variable d'arguments dans une fonction. J'ai écrit (et posté) un utilitaire pour travailler avec de telles paires de propriétés/valeurs, parse_pv_pairs.m . Il vous aide à convertir les paires propriété/valeur en une structure MATLAB. Il vous permet également de fournir des valeurs par défaut pour chaque paramètre. La conversion d'une liste complexe de paramètres en une structure est une tâche difficile. très une façon agréable de les faire circuler dans MATLAB.

7voto

Jonay Cruz Points 96

Voici ma façon simple de définir des valeurs par défaut pour une fonction, en utilisant "try" :

function z = myfun (a, varargin)

%% Default values
b = 1;
c = 1;
d = 1;
e = 1;

try 
    b = varargin{1};
    c = varargin{2};
    d = varargin{3};
    e = varargin{4};
end

%% Calculation
z = a * b * c * d * e;
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X