罗兰关于MATLAB的艺术

将想法转化为MATLAB

设置函数默认值的好方法

上周,我写道职位开关MATLAB中的语句。评论中的一个主题是关于使用开关(或not!)用于为用户未初始化的输入参数设置默认值。我意识到有一个很好的模式来设置这些值,使用一些紧凑的,但可读的代码。

R2019B中的新功能取代了这些想法。请查看新的功能参数验证

内容

函数默认值

有时我想编写一个函数,它有一些必需的输入和一些可选的尾随参数。如果参数是按顺序指定的,而不是按参数-值对指定的,那么有一种很好的方法可以实现这一点瓦拉金.注意,这两个方法都不会检查所覆盖元素的有效性。

假设我的函数需要前2个输入,但用户可以选择设置其他3个输入,或者允许它们使用默认值。在这个场景中,一旦他们选择设置一个可选输入,他们必须在参数列表中设置它之前的所有可选输入。下面是一个示例函数头文件。

dbtypesomefun21
1 .函数y = somefun2(a,b,opt1,opt2)

这是另一种写函数头的方法,使用瓦拉金

dbtype有意思的1
函数y = somefun2Alt(a,b,varargin)

设置默认值

中的默认值somefun2,我可以用开关陈述或使用if-elseif构造。这里我选择了a开关陈述

类型somefun2
函数y=somefun2(a、b、opt1、opt2、opt3)%2个必需输入的函数,3个可选。%n检查输入数量。如果nargin>5错误('myfuns:somefun2:TooManyInputs',…'最多需要3个可选输入');结束%填写未设置的可选值。切换nargin案例2 opt1=eps;opt2=17;opt3=@magic;案例3 opt2=17;opt3=@magic;案例4 opt3=@magic;结束

代码是冗长的,在我看来,不是很漂亮。也很容易出错。如果我决定更改一个值的默认设置,我必须更新每个相关的值案例.拖!

这里有一种方法可以在一个位置设置默认值,然后覆盖用户指定的值。

类型有意思的
函数y=somefun2Alt(a,b,varargin)%某些函数需要2个输入并具有一些可选输入。%n最多只需要3个可选输入numvarargs=length(varargin);如果numvarargs>3错误('myfuns:somefun2Alt:TooManyInputs',…'最多需要3个可选输入');end%设置可选输入opargs的默认值={eps 17@magic};%现在将这些默认值放入valuesToUse单元格数组%,并覆盖varargn.optargs(1:numvarargs)=varargin;%或…%[optargs{1:numvarargs}]=varargin{:};%将可选的args放在可记忆的变量名[tol,mynum,func]=optargs{:};

首先,我将默认的可选值放入单元格数组中optargs.然后复制细胞瓦拉金到中的正确单元格optargs我已经覆盖了默认值。我只有一个地方设置了默认值,并且代码的长度不会随着我添加额外的可选输入而急剧增长。最后,我将单元格从瓦拉金如果我愿意的话。由于单元格数组中的每个元素都是它自己的MATLAB数组,并且MATLAB具有写时复制的行为,所以我不创建这些可选输入的额外副本(参见本帖的更多信息)。

处理可选输入的其他方法

还有其他处理可选输入的方法。这包括指定参数-值对。有或没有这样的配对,您可以使用输入分析器以帮助设置您使用的值。可以在中指定可选输入结构体,其中的字段包含各种选项,您可以使用单元格数组,但是您必须决定如何构造和指定内容。

指定可选值的技术

您是否有一种指定可选值的技术,这种技术对您很有效?请与我们分享在这里

罗兰美国舒尔版权所有2009年MathWorks公司。




发布与MATLAB®R2019b

|

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。