Matlab';的新函数参数验证是否允许不匹配的名称值参数?

Matlab';的新函数参数验证是否允许不匹配的名称值参数?,matlab,optional-arguments,Matlab,Optional Arguments,Tl;Dr:在Matlab新的(2019b)函数参数验证中,有没有一种方法可以使可选名称值参数不匹配 我有现有的Matlab代码,它使用输入解析器将可选参数分派到我的sim卡。 sim卡的设置使您可以选择一些函数来指示对象在其环境中的行为,然后调用runSim。在这个虚构的例子中,我的sim卡被定义为两个函数,分别采用唯一和公共可选输入 runSim('sharedArg',sa',func1Arg1',f1a1',func1Arg1',f1a2',func2Arg1',f2a1) runSim

Tl;Dr:在Matlab新的(2019b)函数参数验证中,有没有一种方法可以使可选名称值参数不匹配

我有现有的Matlab代码,它使用输入解析器将可选参数分派到我的sim卡。 sim卡的设置使您可以选择一些函数来指示对象在其环境中的行为,然后调用
runSim
。在这个虚构的例子中,我的sim卡被定义为两个函数,分别采用唯一和公共可选输入

runSim('sharedArg',sa',func1Arg1',f1a1',func1Arg1',f1a2',func2Arg1',f2a1)

runSim
将调用您选择用于定义sim卡的相应函数,并将这些可选参数传递给每个函数。在这种情况下,
func1
中的输入解析器将忽略
func2arg1
,而
func2
中的输入解析器将忽略
func1Arg1
func1Arg2

一切都很好,但我的sim卡花了三分之一的时间进行输入解析,因为这些函数在一个循环中被调用了数千次。Matlab的输入解析器有一段记录在案的缓慢的历史(这里插入亵渎)

最近更新到2020a后,我发现,这比输入解析器要简单得多。在许多函数中的一些函数上进行了测试,不仅代码更具可读性,而且我还看到了性能的巨大提升

function output=func1FirstTry(选项)
%这个函数做一些事情
论据
options.sharedArg
options.func1Arg1 double=1
options.func1Arg2 double=2
结束
输出=2;
结束
我喜欢。伟大的令人惊叹的。但是

。。。新的函数验证不允许不匹配的参数(或者至少链接页面没有解释它,我还没有找到任何更全面的文档)。以前,
func1
只需要知道它的可选参数。如果我指定
func2arg1
作为
func1
的输入,它将忽略它。对于新的函数验证,这将抛出一个错误,因为我没有在arguments块中将
func2Arg1
定义为允许的输入。所以当我做这个测试时,我不得不做以下几点:

函数输出=func1secondry(选项)
%这个函数做一些事情
论据
options.sharedArg
options.func1Arg1 double=1
options.func1Arg2 double=2
options.func2Arg1 double=Nan
结束
%代码的其余部分在这里
结束

现在可以了,但我还必须更改
func2
以接受
func1
的可选参数。我有20个以上的函数,有可选的参数要考虑,所以显然这个策略是行不通的。有没有一种方法可以指定我想要以输入解析器的相同方式接受和忽略任何未命名的可选输入?具体地说,我希望
func1FirstTry('func2Arg1',3)
不要出错,而不要将
func2Arg1
添加到参数块。

这不是我采用的解决方案,但我认为一个可能的答案是定义一个虚拟类,将解析器的所有可能输入都定义为公共属性,然后使用。因此,该类的所有属性都是函数的合法输入,但是您只能访问特定于该函数的参数。如果要更改默认值,此语法还允许您重新定义任何特定参数

% Define this in its own file
classdef OptionalArgumentClass
    properties
        sharedArg
        func1Arg1
        func1Arg2
        func2Arg1
        argumentUndefinedByOtherFunctions
    end
end

包含
选项。?Path.To.OptionalArgumentClass
意味着我可以通过其他函数指定
func2Arg1
argumentUndefinedByOtherFunctions
并将它们优雅地忽略,这正是我所寻求的。

这并不是我所采用的解决方案,但我认为一个可能的答案是定义一个虚拟类,将解析器的所有可能输入都定义为公共属性,然后使用。因此,该类的所有属性都是函数的合法输入,但是您只能访问特定于该函数的参数。如果要更改默认值,此语法还允许您重新定义任何特定参数

% Define this in its own file
classdef OptionalArgumentClass
    properties
        sharedArg
        func1Arg1
        func1Arg2
        func2Arg1
        argumentUndefinedByOtherFunctions
    end
end

包含
选项。?Path.To.OptionalArgumentClass
意味着我可以通过其他函数指定
func2Arg1
argumentUndefinedByOtherFunctions
并优雅地忽略它们,这正是我想要的。

如果速度很重要,我建议完全跳过验证,并将参数作为结构传递<代码>参数func1=1;args.func3=NaN我应该澄清我并不真正关心验证。函数参数验证恰好是功能的名称。我只想以这种新的方式传递可选参数,我认为这是Matlab朝着正确方向迈出的一大步。它与我现有的代码不一致,不接受不匹配的参数。如果速度很重要,我建议完全跳过验证,并将参数作为结构传递<代码>参数func1=1;args.func3=NaN我应该澄清我并不真正关心验证。函数参数验证恰好是功能的名称。我只想以这种新的方式传递可选参数,我认为这是Matlab朝着正确方向迈出的一大步。它只是与我现有的代码不一致,没有接受不匹配的参数。