2017-02-14 133 views
0

我有一个至少有两个必需的输入参数的函数。根据第二个参数的值,可能会有第三个必需的输入参数。我想知道什么是使用MATLAB的输入分析器来编写一个包含这些需求的健壮功能的最佳方法?用MATLAB的输入解析器解析互斥输入参数

功能可能是这样的:

function vout = test(ReqInpArg1, ReqInpArg2, varargin) 

ReqInpArg2可以包含以下字符串内容:

  • 'cash'
  • 'absHurdleRate'
  • 'none'

如果用户选择cash,那么需要将另一个输入参数numCashTicker定义为varargin的一部分,例如, 'numCashTicker', 4。如果absHurdleRate已被选择,则必须定义不同的输入参数,例如, 'hurdleRate', 0.2。另一方面,如果已经选择了none,则不必定义这些输入参数。事实上,numCashTickerhurdleRate是相互排斥的,即它们不能同时被定义。另外,如果用户没有选择none,他必须定义其他可变参数输入参数之一。

什么是实施这些要求的最佳实践/最佳策略?

+0

能否请您发布的代码示例?也不要要求“最佳策略”,因为它太笼统 - 使它更具体。 – Rotem

回答

0

我想出了以下解决方案:

function vout = test(timeSeries, hurdleRate, varargin)  
    p = inputParser; 
   expectedTypes = {'none', 'cash' 'absHurdleRate'};  
   default_numCashTicker = []; 
   default_absHurdleRate = []; 
   p.addRequired('timeSeries'); 
   p.addRequired('hurdleRate',@(x) any(validatestring(x,expectedTypes))); 
   p.addParameter('numCashTicker', default_numCashTicker); 
   p.addParameter('absHurdleRate', default_absHurdleRate); 
    
    parse(p, timeSeries, hurdleRate, varargin{:}); 

    numCashTicker = p.Results.numCashTicker; 

    switch hurdleRate 
     case 'none' 
      if ~isequal(numCashTicker, default_numCashTicker) 
       throw(MException('test:ParsingError', ... 
        '"none" does not require the "numCashTicker" parameter values"')); 
      elseif ~isequal(absHurdleRate, default_absHurdleRate) 
       throw(MException('test:ParsingError', ... 
        '"none" does not require the "absHurdleRate parameter values"')); 
      end 

     case 'cash' 
      if ~isnumeric(numCashTicker) 
       throw(MException('test:ParsingError', ... 
        '"cash" requires a numeric "numCashTicker" parameter value')); 
      elseif ~isequal(absHurdleRate, default_absHurdleRate) 
       throw(MException('CSmomRoC:ParsingError', ... 
        '"cash" does not require the "absHurdleRate parameter values"')); 
      end 

     case 'absHurdleRate' 
      if ~isnumeric(absHurdleRate) 
       throw(MException('CSmomRoC:ParsingError', ... 
        '"absHurdleRate" requires a numeric "absHurdleRate" parameter value')); 
      elseif ~isequal(numCashTicker, default_numCashTicker) 
       throw(MException('CSmomRoC:ParsingError', ... 
        '"absHurdleRate" does not require the "numCashTicker" parameter value.')); 
      end 
    end 

    ... 
    ... 
    ... 
end;