我想在函数f(a,b,c,d)
上使用inputParser,其中a是强制的,b-d是可选的。我想保留 b-d 命名 = 不使用 f(a, varargin)
,因为当您实际想要使用该函数时,varargin 不会告诉您任何信息。除非给出所有 4 个参数,否则简单的 p.parse(a,b,c,d)
显然不起作用。
我知道如何执行此操作的唯一方法是使用 setDefaultValue(argname, value)
,然后使用 p.parse(...)
检查是否需要。但是有没有一种简单的方法可以仅使用 inputParser(无需大量 if)来破解此问题?
顺便问一下,没有像 MATLAB 中的 C# 那样简单的方法来执行命名参数,对吗?所以我会拥有 f(a,b,c,d)
并按原样使用。第一个参数是 a,然后是 b,然后是 c ...但是当用户想要像 f(a, 'd', 3, 'c', 2)
那样调用它时,他可以。在此示例中,他将保留默认 b 并使用 3 表示 d,使用 2 表示 c。当然,我这边没有大量的工作 - 我知道该怎么做,编写我自己的解析,但我想要一个更简单的解决方案(就像其他人的解析:))
最佳答案
我会给你一个替代答案:不要偷懒,写文档。
如果你这样做:
function [out]= foo(a,b,c,d)
%FOO does foo things
%
% FOO(a,b) does very foo thins to a and b
%
% FOO(a,b,c) is quite foo-y on c also
%
% FOO(a,b,c,d) c and d are optional FOO things
if (nargin==3)
...
然后,如果用户按 F1
或输入 help foo
,他们将获得注释中的所有信息。
为了让用户能够在我的代码中输入诸如 foo(1,2,'d',5)
之类的输入,我使用以下 "inputparser"
可选参数:
function [c,d]=parse_inputs(argin)
opts= {'c','d'};
defaults=ones(length(opts),1);
% Check inputs
nVarargs = length(argin);
if mod(nVarargs,2)
error('InvalidInput','Invalid number of inputs')
end
% check if option has been passed as input
for ii=1:2:nVarargs
ind=find(ismember(opts,lower(argin{ii})));
if ~isempty(ind)
defaults(ind)=0;
else
error('InvalidInput',['Optional parameter "' argin{ii} '" does not exist' ]);
end
end
for ii=1:length(opts)
opt=opts{ii};
default=defaults(ii);
% if one option is not default, then extrac value from input
if default==0
ind=double.empty(0,1);jj=1;
while isempty(ind)
ind=find(isequal(opt,lower(argin{jj})));
jj=jj+1;
end
if isempty(ind)
error('InvalidInput',['Optional parameter "' argin{jj} '" does not exist' ]);
end
val=argin{jj};
end
switch opt
case 'c':
if default;
c=4;
else
c=val;
end
...
otherwise
error('InvalidInput',['Invalid input name:', num2str(opt),'\n No such option in SART()']);
end
end
然后我在 foo 中做的第一件事是:
[c,d]=parse_inputs(varargin);
关于matlab - 没有 varargin 的 inputParser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42667004/