Skipping Optional Positional Arguments
50 ビュー (過去 30 日間)
古いコメントを表示
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 件のコメント
Stephen23
2024 年 10 月 25 日 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:
回答 (3 件)
Star Strider
2024 年 10 月 25 日 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 件のコメント
Walter Roberson
2024 年 10 月 26 日 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 件のコメント
埃博拉酱
2024 年 10 月 26 日 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 件のコメント
参考
カテゴリ
Help Center および File Exchange で Argument Definitions についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!