用于编译的Matlab程序的getopts样式参数

时间:2019-05-09 07:50:24

标签: matlab

除了使用包装器之外,还有其他方法可以在使用{编译的matlab程序中使用getopts样式的参数(例如-v-n 3--some_parameter=7) {1}}?

2 个答案:

答案 0 :(得分:3)

如果要为MATLAB程序(无论是否编译)创建getopt类命令行功能,则可以使用inputParser对象(通常是输入处理的最佳方法)不是是您的最佳选择。 inputParser功能非常适合遵循特定顺序(即,在参数列表中定位)并遵循“参数/值对”格式的函数参数。典型的getopt样式功能涉及不需要遵循特定顺序的选项列表,并且具有“仅选项”(例如-v)或“带有参数的选项”(例如-n 3或{ {1}})格式。

您可能需要在已编译程序的开始处添加自己的输入解析例程。如herehere所述,当您使用命令语法调用程序时,所有输入均作为一系列字符向量传递。如果像这样用variable input argument list定义函数,则:

--some_parameter=7

然后按如下所示调用函数:

function getopt_example(varargin)

将导致getopt_example -v -n 3 --some_parameter=7 具有以下内容:

varargin

然后有必要遍历此单元格数组,解析选项并相应地设置/存储参数(在根据需要将它们从字符向量转换为数值之后)。有多种方法可以实现此功能,具体取决于要允许的选项格式。这是解析您上面提到的示例参数类型的一种方法的示例:

  1×4 cell array

    {'-v'}    {'-n'}    {'3'}    {'--some_parameter=7'}

function getopt_example(varargin) % Define opts as {'name', has an argument, default value}: opts = {'v', false, false; ... % No argument, default unset 'n', true, 1; ... % double argument, default 1 'some_parameter', true, uint8(0)}; % uint8 argument, default 0 args = {}; % Captures any other arguments % Parse input argument list: inputIndex = 1; while (inputIndex <= nargin) opt = varargin{inputIndex}; if strcmp(opt(1), '-') || strcmp(opt(1:2), '--') % A command-line option % Get option and argument strings: opt = strip(opt, 'left', '-'); [opt, arg] = strtok(opt, '='); [isOpt, optIndex] = ismember(opt, opts(:, 1)); assert(isOpt, 'Invalid input option!'); if opts{optIndex, 2} % Has an argument if isempty(arg) % Argument not included with '=' assert(inputIndex < nargin, 'Missing input argument!'); arg = varargin{inputIndex+1}; inputIndex = inputIndex+2; else % Argument included with '=' arg = arg(2:end); assert(~isempty(arg), 'Missing input argument!'); inputIndex = inputIndex+1; end % Convert argument to appropriate type: argType = class(opts{optIndex, 3}); if ~strcmp(argType, 'char') arg = cast(str2double(arg), argType); assert(~isnan(arg), 'Invalid input option format!'); end opts{optIndex, 3} = arg; else % Has no argument opts{optIndex, 3} = true; inputIndex = inputIndex+1; end else % A command-line argument args = [args {opt}]; inputIndex = inputIndex+1; end end % Display results: disp(opts(:, [1 3])); disp(args); end 单元格数组最初存储可能的选项(如果它们具有关联的参数)以及默认值。解析输入参数后,默认值将被传递给函数的所有值覆盖。 opts单元格数组捕获与任何选项都不匹配的所有参数。以下是一些示例输入和结果:

args

答案 1 :(得分:1)

听起来您正在寻找inputParser对象。

根据有关仅链接答案的评论进行了编辑。

以下是该函数的一些示例用法,该函数具有2个必需输入和2个可选参数:

function hObj = dasImagePrototype(hAx, dasStruct, varargin)

% ...

defaultDepthUnit = getpref('HOTB', 'units_unitSystem', 1);

p = inputParser;
p.addRequired('hAx', @(x) isa(x, 'matlab.graphics.axis.Axes'))
p.addRequired('dasStruct', @(x) isstruct(x) && isfield(x,'psd'))
p.addParameter('depthUnit', defaultDepthUnit, @(x) ismember(x,1:2))
p.addParameter('whichFbe', 1, @(x) floor(x)==x && x>0)
p.parse(hAx, dasStruct, varargin{:})

% access hAx & dasStruct directly since they're `Required` inputs
% but we still pass them to the input parser anyways to validate
hObj.hAx = hAx;
hObj.dasStruct = dasStruct; 

% note that since depthUnit & whichFbe are `Parameter` and not 
% `Required` inputs, we need to access them from the p object
hObj.depthUnit = p.Results.depthUnit;
hObj.whichFbe = p.Results.whichFbe;