2017-02-14 3 views
0

Ich habe eine Funktion, die mindestens zwei erforderliche Eingabeargumente hat. Abhängig vom Wert des zweiten Arguments könnte ein drittes Eingabeargument erforderlich sein. Ich frage mich, was ist der beste Weg, um eine robuste Funktion zu kodieren, die diese Anforderungen mit MATLAB Eingangsparser enthält?Parsen Sie sich gegenseitig ausschließende Eingabeargumente mit dem Eingabe-Parser von MATLAB

Die Funktion kann wie folgt aussehen:

function vout = test(ReqInpArg1, ReqInpArg2, varargin) 

ReqInpArg2 kann die folgende Zeichenfolge Inhalt halten:

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

Wenn der Benutzer cash wählt, muss ein anderes Eingabeargument numCashTicker als Teil von varargin definiert werden, z. 'numCashTicker', 4. Wenn absHurdleRate ausgewählt wurde, muss ein anderer Eingabeparameter definiert werden, z. 'hurdleRate', 0.2. Wenn dagegen none gewählt wurde, muss keiner dieser Eingangsparameter definiert sein. In der Tat schließen sich numCashTicker und hurdleRate gegenseitig aus, d.h. sie müssen nicht gleichzeitig definiert sein. Wenn der Benutzer none nicht ausgewählt hat, muss er eines der anderen varargin-Eingabeargumente definieren.

Was ist Best Practice/die beste Strategie, um diese Anforderungen zu implementieren?

+0

Können Sie bitte ein Codebeispiel posten? Fragen Sie auch nicht nach der "besten Strategie", weil sie zu allgemein ist - präzisieren Sie sie. – Rotem

Antwort

0

kam ich auf die folgende Lösung:

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; 
Verwandte Themen