nargin,vargin,exists,实现可选参数matlab的最佳方法是什么

时间:2016-09-30 20:06:50

标签: matlab

我在matlab中有一个函数:

function output = myfunc(a,b,c,d,e)
      %a and b are mandetory
      %c d and e are optional
end 

如果用户为e而不是c和d提供了可选的arg,我将如何处理输入?

nargin只给出了参数的数量。会存在最好的方式吗?

2 个答案:

答案 0 :(得分:2)

只需使用 nargin 即可。它会告诉你有多少参数存在。仅当您拥有变量个参数时才使用varargin,即您没有参数数量限制,或者您希望以索引方式访问参数。我认为这不是你的情况,所以一个解决方案可能看起来像这样。

function output = myfunc(a,b,c,d,e)
  %a and b are mandetory
  %c d and e are optional
  if nargin < 3 || isempty(c)
     c = <default value for c>
  end
  if nargin < 4 || isempty(d)
     d = <default value for d>
  end
  if nargin < 5 || isempty(e)
     e = <default value for e>
  end
  <now do dome calculation using a to e>
  <If a or b is accessed here, but not provded by the caller an error is generated by MATLAB>

如果用户不想为c或d提供值但提供e,则他必须传递[],例如 func(a,b,c,[],e),省略d。

或者你可以使用

if nargin == 5
   <use a b c d and e>
elseif nargin == 2
   <use a and b>
else    
   error('two or five arguments required');
end

检查是否存在所有参数e。但这需要2或5个参数。

答案 1 :(得分:1)

您可以将cde定义为可选,然后根据位置分配值。如果他们想要e而不是c,则需要空输入。例如:

function output = myfunc( a, b, varargin )

optionals = {0,0,0}; % placeholder for c d e with default values

numInputs = nargin - 2; % a and b are required
inputVar = 1;

while numInputs > 0
    if ~isempty(varargin{inputVar})
        optionals{inputVar} = varargin{inputVar};
    end
    inputVar = inputVar + 1;
    numInputs = numInputs - 1;
end

c = optionals{1};
d = optionals{2};
e = optionals{3};

output = a + b + c + d + e;

这只会将所有内容添加到一起。有很多错误检查需要发生。更好的方法可能是inputParser。这会进行配对输入和检查。见Input Parser help