除了使用包装器之外,还有其他方法可以在使用{编译的matlab程序中使用getopts
样式的参数(例如-v
或-n 3
或--some_parameter=7
) {1}}?
答案 0 :(得分:3)
如果要为MATLAB程序(无论是否编译)创建getopt
类命令行功能,则可以使用inputParser
对象(通常是输入处理的最佳方法)不是是您的最佳选择。 inputParser
功能非常适合遵循特定顺序(即,在参数列表中定位)并遵循“参数/值对”格式的函数参数。典型的getopt
样式功能涉及不需要遵循特定顺序的选项列表,并且具有“仅选项”(例如-v
)或“带有参数的选项”(例如-n 3
或{ {1}})格式。
您可能需要在已编译程序的开始处添加自己的输入解析例程。如here和here所述,当您使用命令语法调用程序时,所有输入均作为一系列字符向量传递。如果像这样用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;