【问题标题】:Parse mutually exclusive input arguments with MATLAB's input parser使用 MATLAB 的输入解析器解析互斥的输入参数
【发布时间】:2017-07-02 10:21:15
【问题描述】:

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

函数可能如下所示:

function vout = test(ReqInpArg1, ReqInpArg2, varargin)

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

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

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

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

【问题讨论】:

  • 你能发一个代码示例吗?也不要要求“最佳策略”,因为它太笼统 - 让它更具体。

标签: matlab optional-arguments


【解决方案1】:

我想出了以下解决方案:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 2020-06-05
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多