我想在函数f(a,b,c,d)
上使用inputParser,其中a是必需的,b-d是可选的。我想保持b-d named = not use f(a, varargin)
,因为当你真正想要使用该函数时,varargin不告诉你任何事情。除非给出所有4个参数,否则简单的p.parse(a,b,c,d)
显然不起作用。
我知道如何操作的唯一方法是使用setDefaultValue(argname, value)
,然后根据需要使用p.parse(...)
进行检查。但有没有一种简单的方法可以使用inputParser(没有大量的ifs)来破解它?
作为一个附带问题,没有简单的方法可以在MATLAB中使用C#中的命名参数,对吧?所以我会拥有f(a,b,c,d)
并使用它。第一个参数是a,然后是b,然后是c ...但是当用户想要像f(a, 'd', 3, 'c', 2)
那样调用它时,他可以。在这个例子中,他将保持默认b并使用3表示d,2表示c。当然,我没有大量的工作 - 我知道如何去做,写我自己的解析,但我想要一个更简单的解决方案(就像其他人的解析:))
答案 0 :(得分:2)
我会给你另一个答案:不要懒,写文档。
如果你这样做:
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);
答案 1 :(得分:0)
Ander Biguri's answer很好地回答了关于如何处理不同varargin
的不同数量输入的问题的第一部分。
关于如何成对解析输入的问题的第二部分,这是我简化的"输入解析器" :
function parseVarargin( argin )
% Simplified function to parse varargin property-value pairs
% Read input arguments
if mod(numel(argin),2)
error('Uneven number of inputs')
end
for i = 1 : 2 : numel(argin)-1
if ~ischar(argin{i})
error('Properties must be strings')
end
isValid = evalin('caller', sprintf('exist(''%s'',''var'')', argin{i}));
if isValid && ~strcmp(argin{i},'MRX')
assignin('caller', argin{i}, argin{i+1})
else
error(['Undefined property %s. ', ...
'Please note case-sensitivity.'], argin{i});
end
end
要使用它,只需在parseVarargin
上设置默认变量值和调用varargin
:
function foo( a, varargin )
%FOO general description
%
% Usage:
% foo(a)
% foo(a, 'property-value-pairs')
%
% Properties:
% b : This ...
% c : That ...
% Default property values
b = 1;
c = [];
% Read property-value paris
parseVarargin( varargin );
% Do other stuff