web-dev-qa-db-fra.com

Arguments optionnels dans les fonctions MATLAB

Comment déclarer une fonction dans MATLAB avec des arguments facultatifs?

Par exemple: function [a] = train(x, y, opt), où opt doit être un argument facultatif.

58
Yekver

Il y a quelques options différentes sur la façon de faire cela. Le plus fondamental consiste à utiliser varargin , puis à utiliser nargin, size, etc., afin de déterminer si les arguments facultatifs ont été transmis à la fonction. .

% Function that takes two arguments, X & Y, followed by a variable 
% number of additional arguments
function varlist(X,Y,varargin)
   fprintf('Total number of inputs = %d\n',nargin);

   nVarargs = length(varargin);
   fprintf('Inputs in varargin(%d):\n',nVarargs)
   for k = 1:nVarargs
      fprintf('   %d\n', varargin{k})
   end

Une solution un peu plus élégante consiste à utiliser la classe inputParser pour définir tous les arguments attendus par votre fonction, qu'ils soient obligatoires ou facultatifs. inputParser vous permet également de vérifier le type de tous les arguments.

42
Praetorian

Un moyen simple de le faire est via nargin (N arguments dans). L'inconvénient est que vous devez vous assurer que votre liste d'arguments et les contrôles nargin correspondent.

Il convient de rappeler que toutes les entrées sont facultatives, mais les fonctions se fermeront avec une erreur si elles appellent une variable non définie. L'exemple suivant définit les valeurs par défaut pour b et c. Sortira si un n'est pas présent.

function [ output_args ] = input_example( a, b, c )
if nargin < 1
  error('input_example :  a is a required input')
end

if nargin < 2
  b = 20
end

if nargin < 3
  c = 30
end
end
47
Morgan

Une bonne façon de procéder consiste à ne pas utiliser nargin, mais à vérifier si les variables ont été définies à l'aide de exist('opt', 'var').

Exemple:

function [a] = train(x, y, opt)
    if (~exist('opt', 'var'))
        opt = true;
    end
end

Voir cette réponse pour les pros de le faire de cette façon: Comment vérifier si un argument est fourni dans un appel de fonction?

39
Evgeni Sergeev