Skipping Optional Positional Arguments
40 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
I am writing a routine that uses arguments to parse input parameters. After many years of using both inputParser and manual input parsing, I like using arguments. However, I seem to be running into some limitations.
I am trying to get arguments to ignore an optional positional arguments. Take the example function:
function y = foo(a,b,c)
arguments
a
b = 2
c = 3
end
y = a + b + c;
end
Suppose I want to specify arguments for a and c and use the default value of b. With manual parsing, I would just detect an empty value for b by calling foo(1,[],3). When using arguments, I can not achieve the same functionality by calling as foo(1,~,3) or similar syntax.
Is there a way to get this functionality without resorting to manual parsing?
2 Commenti
Stephen23
il 25 Ott 2024 alle 23:27
"Is there a way to get this functionality without resorting to manual parsing?"
Not as far as I am aware. You should make an enhancement suggestion here:
Risposte (3)
Star Strider
il 25 Ott 2024 alle 23:36
To illustrate —
out = foo(1,pi,3)
out = foo(1,[],3)
out = foo(1,~,3)
function y = foo(a,varargin)
optargs = cell(1,2);
optargs(1:numel(varargin)) = varargin;
if isempty(optargs{1})
b = 2;
else
b = optargs{1};
end
if isempty(optargs{2})
c = 3;
else
c = optargs{2};
end
y = a + b + c;
end
Not everything is possible.
.
0 Commenti
Walter Roberson
il 26 Ott 2024 alle 3:53
Unfortunately you cannot use [] to trigger detection as "missing" for the purpose of default argument processing.
function y = foo(a,b,c)
arguments
a
b double {mustBeEmptyOrNumeric(b)} = 2
c = 3
end
if isempty(b); b = 2; end
y = a + b + c;
end
function mustBeEmptyOrNumeric(b)
if ~isempty(b) && ~isnumeric(b)
eidType = 'mustBeEmptyOrNumeric:notEmptyOrNumeric';
msgType = 'Input must be empty or numeric.';
error(eidType, msgType);
end
end
0 Commenti
埃博拉酱
il 26 Ott 2024 alle 15:02
It is recommended that you use name-value arguments:
function y = foo(a,options)
arguments
a
options.b = 2
options.c = 3
end
y = a + b + c;
end
Then you can specify c without b:
foo(1,c=3);
0 Commenti
Vedere anche
Categorie
Scopri di più su Argument Definitions in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!