J'ai une fonction pour laquelle j'aimerais passer des arguments par l'intermédiaire de varargin
et utiliser le inputParser
pour s'assurer que les intrants sont sains d'esprit. Certains arguments sont nécessaires, d'autres non. Voici un exemple :
function myFunc(varargin)
p = inputParser;
p.addRequired(...
'numStates', ...
@(x) validateattributes(x, {'numeric'}, ...
{'scalar', 'integer', 'positive'}));
p.addRequired(...
'numInps', ...
@(x) validateattributes(x, {'numeric'}, ...
{'scalar', 'integer', 'positive'}));
p.addRequired(...
'numOuts', ...
@(x) validateattributes(x, {'numeric'}, ...
{'scalar', 'integer', 'positive'}));
p.addRequired(...
'X0', ...
@(x) validateattributes(x, {'numeric'}, ...
{'vector'}));
p.addOptional(...
'freq', 10, ...
@(x) validateattributes(x, {'numeric'}, ...
{'scalar', 'integer', 'positive'}));
p.addOptional(...
'SimulinkVariables', struct(), ...
@(x) isa(x, 'struct'));
p.parse(varargin{:});
%# do stuff with variables
end
J'aimerais pouvoir passer des arguments comme suit ; peu importe quelle paire est passée à quel moment, tant que les arguments requis sont présents. Un exemple d'appel pourrait donc être le suivant :
myFunc('numStates', 4, 'numInps', 2, 'numOUts', 3, 'X0', [4;0]);
Apparemment, cette syntaxe est illégale ; parse()
s'attend à ce que les premiers arguments soient les valeurs requises, mais ils ne doivent pas être nommés explicitement, c'est-à-dire comme dans :
function myFunc(numStates, numInps, numOuts, X0, varargin)
...
p.parse(numStates, numInps, numOuts, X0, varargin{:});
end
Existe-t-il un moyen simple de faire ce que je veux, c'est-à-dire la première fonction ? Je suppose que la chose la plus simple à faire est de réorganiser les éléments de varargin
et expulser les noms des arguments, mais ce n'est pas très élégant.