inputParser提供了addOptional和addParameter。该文档(https://www.mathworks.com/help/matlab/ref/inputparser-class.html)说
你可以通过调用定义你的方案
addRequired,addOptional以及addParameter以任何顺序,但是当你调用使用输入解析器的功能,你应该在需要的投入第一,其次是任何可选位置输入传递,最后,任何名称-值对。
但是我无法完成这项工作,并出现以下错误。
K>> a = inputParser;
K>> addOptional(a, 'o', 'x');
K>> addParameter(a, 'p', 1);
K>> parse(a, 'w', 'p', 2)
Run Code Online (Sandbox Code Playgroud)
参数'w'是一个字符串,与任何参数名称都不匹配。它对参数的验证失败'o'。
如果我们将默认值定义为数字。
a = inputParser;
addOptional(a, 'o', 42);
addParameter(a, 'p', 1);
parse(a, 'p', 2);
parse(a, 3, 'p', 2);
parse(a, 3);
Run Code Online (Sandbox Code Playgroud)
有用。
我有想念吗?
我不建议将inputParserwith与允许用作字符数组的可选参数一起使用,因为parse()不能区分用户是否传递参数名(始终为type char)或可选输入参数。因此,为什么不能将a char作为可选输入参数传递,是这种行为的逻辑结果。
但是,如果为可选输入参数(可能为)指定一个验证函数,则char可以使其生效。从addOptional“提示”部分的文档中:
对于可选的字符串输入,请指定验证功能。如果没有验证功能,输入解析器会将有效的字符串输入解释为无效的参数名称,并引发错误。
这是您的示例生成的错误。
'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
Run Code Online (Sandbox Code Playgroud)
最后一行似乎违反直觉,但事实并非如此!我们希望解析器能够检测到该参数,'p'而不是隐式地假定它是我们为可选参数提供的字符'o',而我们希望忽略该参数。但是,正如我现在要解释的那样,这是预期的行为。
char可选选项会给您inputParser带来麻烦预期的行为是可以预期的,因为可选参数和参数参数都不是必需的,即可选参数。如果您有两个可选的输入参数'o1'和'o2',它们的顺序对输入解析器很重要(这就是MATLAB文档将它们称为“可选的位置参数”的原因)。您永远不能在传递'o2'之前先传递的值'o1'。这意味着'o2'只有在'o1'也指定时才能使用。换句话说,'o1'阻止使用任何其他可选参数。
对于参数也是如此,该参数应始终在其他可选输入参数之后(如您已引用的)。因此,如果允许任何可选输入参数为,则它们的行为类似于可选char。结果是MATLAB inputParser不知道char输入是可选输入参数还是参数。MATLAB的开发人员已决定要求对可选输入进行显式排序,因此MATLAB可以确保将哪些可选参数传递给parse()。
char因为使用可选输入参数要求MATLAB假设某些输入参数引用可选输入参数,而另一些参数引用参数,所以如果未指定所有可选参数,最终用户可能会导致错误,行为或意外结果。
如果明确编写输入自变量方案以防止这种意外的隐式行为,则更好。我建议,如果需要接受char输入的可选输入参数,则应始终使它们成为参数,即使用的名称-值对参数addParameter。char只有在不使用任何参数的情况下,才使用接受输入的可选输入参数,或者通过显式声明(例如,在帮助中)只有当也给出所有可选输入参数时,才可以使用参数输入参数。