我不建议将inputParser与允许为字符数组的可选参数一起使用,因为parse()无法区分用户是否传递参数名称(总是为char类型)或可选的输入参数.因此,这种行为的逻辑结果是您无法将char作为可选输入参数传递.
但是,如果为可能是char的可选输入参数指定验证函数,则可以使其工作.从“提示”部分的addOptional文档中:
For optional string inputs, specify a validation function. Without a validation function, the input parser interprets valid string inputs as invalid parameter names and throws an error.
这是您的示例生成的错误.
修复你的例子
‘o’是可选的输入参数.如果您知道如何验证值’o’需要接受,请提供一个验证函数,该函数对这些有效输入返回true.例如,如果您知道’o’将始终是char数组,请尝试以下(逐行).
a = inputParser;
addOptional(a, 'o', 'default', @ischar);
addParameter(a, 'p', 1);
parse(a, 'x'); % OK
parse(a, 'Hello, World!', 'p', 2); % OK
parse(a, 'p', 'p', 'p') % OK, although quite cryptic
parse(a, 3); % Throws an error, as expected, because 3 is not a char
parse(a, 'p', 4) % Throws a somewhat unexpected error, because we meant to set parameter 'p' to value 4
最后一行似乎违反直觉,但事实并非如此!我们希望解析器检测参数’p’而不是隐式假设它是我们为可选参数’o’提供的字符,我们想省略它.不过,正如我现在要解释的那样,这是预期的行为.
为什么char选项会给inputParser带来困难
预期的bahviour是预期的,因为可选参数和参数参数都不是必需的,即可选的.如果你有两个可选的输入参数,’o1’和’o2′,它们的顺序对输入解析器很重要(这就是MATLAB文档称它们为’可选位置参数’的原因).你永远不能在’o1’的值之前传递’o2’的值.这意味着只有在指定’o1’时才能使用’o2′.换句话说,’o1’阻止使用任何其他可选参数.
参数也是如此,它应该始终位于其他可选输入参数之后(如您所引用的那样).因此,如果允许任何可选输入参数为char,则它们的行为类似于可选项.结果是MATLAB的inputParser不知道char输入是可选的输入参数还是参数. MATLAB的开发人员决定要求显式排序可选输入,因此MATLAB可以确定将哪些可选参数传递给parse().
如果可选输入可能是char,则建议采取措施
因为使用可选的输入参数需要MATLAB假设某些输入参数引用可选的输入参数,其他引用参数,如果未指定所有可选参数,这可能导致最终用户意外的错误,行为或结果.
如果明确写入以防止这种意外的隐式行为,则输入参数方案会更好.我建议如果需要接受char输入的可选输入参数,你总是使用addParameter创建参数,即名称 – 值对参数.使用接受char输入的可选输入参数仅在不使用任何参数时有效,或者通过显式声明(例如在帮助中)当且仅当同时给出所有可选输入参数时才能使用参数输入参数.