Matlab 中的输入参数处理真的很烦人。这有效:
function out = foobar(foo, bar, baz)
if ~exist('baz', 'var') || isempty(baz)
baz = 'default_value';
end
这需要对所有可选输入参数重复。优点:它也不依赖于函数定义中参数的顺序。另一种选择是所有nargin
黑客:
if nargin < 3 || isempty(baz)
baz = 'baz';
if nargin < 2 || isempty(bar)
bar = 'bar';
if nargin < 1 || isempty(foo)
foo = 'foo';
end
end
end
显然这是丑陋的并且不是很可扩展;加上它取决于参数的定义顺序。
最后一个选项可能是 inputParser,但我不知道如何使用它轻松完成“isempty”部分。我在@DavidKetcheson 发布的示例中找不到这种类型的输入处理。
编辑:@FedericoPoloni 提到了另一种选择:选项结构。我认为如果您有很多输入参数(并且如果您在解析未知字段名称以规避 FredericoPoloni 提到的混淆时抛出错误),它们是可以的。我会使用这样的东西:
function test(foobar, opts)
default_opts.foo = 'foo';
default_opts.bar = 'bar';
if nargin > 1
opts = parse_opts(default_opts, opts);
end
并作为一个单独的功能:
function parsed_opts = parse_opts(default_opts, in_opts)
in_fields = fieldnames(in_opts);
n_in_fields = numel(in_fields);
parsed_opts = default_opts;
for i_field = 1:numel(in_fields)
cur_field = in_fields{i_field};
if isfield(default_opts, cur_field)
parsed_opts.(cur_field) = in_opts.(cur_field);
else
error('parse_opts:input', 'Unknown field name `%s`', cur_field);
end
end