inputParser没有varargin

时间:2017-03-08 09:03:56

标签: matlab

我想在函数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。当然,我没有大量的工作 - 我知道如何去做,写我自己的解析,但我想要一个更简单的解决方案(就像其他人的解析:))

2 个答案:

答案 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