主要内容

函数参数验证

论证验证简介

函数参数验证是一种在功能输入参数上声明特定限制的方法。使用参数验证,您可以约束函数输入值的类,大小和其他方面,而无需在函数正文中编写代码以执行这些测试。

函数参数验证是声明性的,这使得matlab启用®桌面工具通过检查特定代码块来提取有关功能的信息。通过声明输入参数的要求,您可以消除繁琐的参数检查代码并提高代码的可读性,稳健性和可维护性。

函数参数验证语法简化了定义可选参数、重复参数和名称-值参数的过程。该语法还允许您以一致的方式定义默认值。

在哪里使用参数验证

函数参数验证的使用在函数定义中是可选的。参数验证在可以被任何代码调用的函数中最有用,并且在执行函数代码之前必须确定输入的有效性。为他人使用而设计的函数可以受益于对参数输入的适当限制,并有机会根据函数的输入返回特定的错误消息。

哪里不需要验证

在本地函数和私有函数以及私有方法或受保护的方法中,调用方知道输入需求,因此可以使用有效参数调用这些类型的函数。

哪里不允许验证

您不能在嵌套函数中使用Argument Validation语法,抽象方法或处理类析构函数方法。有关方法中的参数验证的更多信息,请参阅类方法中的参数验证

参数块语法

函数在由关键字分隔的代码块中定义参数验证参数结尾.如果使用,一个参数块必须在函数的第一个可执行行之前启动。

你可以使用多个参数函数中的块,但所有块必须在任何不属于一个代码之前发生的参数块。

以下代码中的突出显示区域显示了参数验证的语法。

函数参数声明可以包括这些限制中的任何一个:

  • 尺寸 - 每个尺寸的长度,括在括号中

  • 类 - 单个Matlab类的名称

  • 函数 - 逗号分隔的验证函数列表,括在括号中

您还可以在函数验证声明中为输入参数定义一个默认值。默认值必须满足该参数声明的限制。

尺寸

验证大小是输入参数的尺寸,使用非负整数或冒号指定().结肠表明该维度允许任何长度。您无法使用尺寸的表达式。分配给函数调用中参数的值必须与指定的大小兼容,或者matlab抛出错误。

MATLAB索引的分配规则适用于大小规范。例如,1×1值与指定的大小兼容(5,3)因为MATLAB应用标量展开式。此外,MATLAB行-列转换适用,使大小指定为(1,:)可以接受1-by-n和n-by-1的大小。

这里有些例子:

  • (1,1)- 输入必须完全是1×1。

  • (3,:)- 第一个维度必须是3,第二维可以是任何值。

如果未指定大小,则允许任何大小,除非受验证函数限制。

验证类是单个类的名称。分配给函数输入的值必须是指定的类或转换为指定的类。使用MATLAB支持的任何MATLAB类或外部定义的类,除了Java,COM类和不使用的MATLAB类定义之外金宝appclassdef关键字(Matlab软件版本7.6之前定义的类)。

这里有些例子:

  • char- 输入必须是类char或者matlab可以转换为a的值char, 如字符串

  • 双倍的- 输入可以是任何精度的数值。

  • 细胞- 输入必须是单元数组。

  • 用户定义的类(例如枚举类)可以限制对更具体值的输入,并使您可以控制支持的转换。金宝app

如果您未指定类,则允许任何类,除非验证函数限制。

验证功能

验证函数是一个MATLAB函数,如果参数值不满足某些要求,该函数将抛出错误。验证函数不返回值,而且与class和size不同,它不能更改正在验证的参数的值。

在验证过程中,MATLAB将参数值传递给针对该参数列出的每个验证函数。传递给验证函数的值是类和大小规范所做的任何转换的结果。MATLAB从左到右调用每个函数,并抛出遇到的第一个错误。

对于预定义验证函数的表,请参阅参数验证功能

默认值

参数默认值可以是任何满足大小、类和验证函数需求的常量或表达式。在参数声明中指定默认值使参数可选。当函数调用中没有包含参数时,MATLAB使用默认值。每次使用默认值时都会计算默认值表达式。

笔记

因为MATLAB只在函数没有参数值时才验证默认值,只有在函数没有参数值时,无效的默认值才会导致错误。

可选的参数必须在函数签名中的所需参数后定位参数块。有关可选参数的更多信息,请参阅必需和可选的位置论点

验证序列

争论从上到下验证参数块。MATLAB以特定的顺序验证参数声明的每个部分。首先验证类,然后验证类的大小。类和大小验证的结果被传递给验证函数。根据是否在参数声明中包含类、大小和验证函数,每个步骤都是可选的。

有关更多信息,请参阅论证验证的顺序

转换为宣布的类和大小

由于标准的MATLAB转换规则,类验证和大小验证都可以改变输入参数的值。因此,函数体中经过验证的值可能与调用函数时传递的值不同。转换规则是由MATLAB应用于形式的索引赋值的规则派生出来的:

(指数)=值

MATLAB可以确定左侧值对类和大小有要求,在某些情况下,可以将右侧值转换为所需的类和大小。

相关信息请参见避免课堂和大小转换

论证验证的例子

参数块指定三个输入的大小和类。

功能OUT = myFunction(a,b,c)参数一种(1,1)字符串B.(1,:)双C(2,2)细胞结尾%函数代码...结尾

在此功能中,变量必须满足这些验证要求:

  • 一种是字符串标量。

  • B.是一个1乘任意长度的双精度向量。

  • C是一个2×2个单元格阵列。

价值转换

以下功能说明了如何转换输入以匹配所指定的类参数块。这Speedenum.类是创建的枚举类以定义第三个输入参数允许的值。

功能forwardspeed(a,b,c)参数一种双倍的B.charCSpeedenum.结尾%函数代码DISP(类(a))disp(类(b))disp(类(c))结尾

这是枚举类。

classdefspeedenum 枚举全(100)半(50)停止(0)结尾结尾

此调用该函数使用MATLAB可以转换为声明类型的输入值。函数中的实际参数类型显示为输出。

转发(Int8(4),“一个字符串”'满的'
双Char Speedenum.

使用验证函数的具体限制

验证函数可以以更具体的方式限制输入参数。您可以为许多常见类型的验证使用预定义的验证功能,您可以定义自己的验证功能以满足特定要求。

例如,此函数指定使用以下验证mustBeNumeric厄伯MustBemember.,以及本地功能Mustbeequalsize.

  • 输入X必须是任何长度的真实数字行向量。

  • 输入V.必须是一个真实的数字行矢量与尺寸相同X

  • 输入方法必须是一个字符向量,这是三个允许的选择之一。因为方法指定一个默认值,此参数是可选的。

功能myInterp(x,v,方法)参数X(1,:) {mustbenumeric,mustbereal}V.(1,:) {MustBenumeric,Mustbereal,MustBeequalsize(v,x)}方法(1,:) char {mustbemmber(方法,{'linear','cubic','spline'})}=“线性”结尾%函数代码...结尾%自定义验证功能功能Mustbeequalsize(a,b)%测试相同的大小如果~ isequal(大小大小(a)、(b))开斋节='尺寸:不等';msg =.'第一个输入的大小必须等于第二输入的大小。;BrontcAller(MEXception(EID,MSG))结尾结尾

避免在自定义验证函数中使用函数参数验证。有关定义验证功能和预定义验证功能列表的详细信息,请参阅参数验证功能

各种论点

函数参数验证可以声明四种参数。函数可以定义这些参数中的任何一个,但必须按以下顺序定义参数:

  1. 所需的位置论点

  2. 可选的位置参数

  3. 重复的位置参数

  4. 可选名称 - 值参数

必需和可选的位置论点

位置参数必须按照特定的顺序传递给函数。参数列表中传递的值的位置必须与参数在参数块。所有参数名称都在参数块必须是唯一的。

位置论点参数如果参数定义默认值,否则请在调用函数时需要块。在参数声明中指定默认值使得一个位置参数是可选的,因为MATLAB可以在函数调用中传递任何值时使用默认值。

默认值可以是生成满足参数声明的结果的常量或表达式。表达式可以指在它之前声明的参数参数块,但不是在它之后声明的参数。

只有当函数调用中没有包含参数时,MATLAB才计算默认值表达式。

类中的所有必需参数之后,所有可选参数都必须被放置参数块。例如,在此参数块中,maxval.迷你瓦尔有默认值,因此是可选的。

功能myFunction (x, y, maxval minval)参数X(1,:)双y(1,:)双maxval.(1,1)的两倍= max(max(x),max(y))minval(1,1)的两倍= min(min(x),min(y))结尾%函数代码...结尾

您可以使用任何这些语法调用此函数:

myFunction(x,y,maxval,minval)myfunction(x,y,maxval)myfunction(x,y)

当必须在函数调用中填写其位置时,需要一个可选的位置参数,以识别在其之后的参数。也就是说,如果要指定值迷你瓦尔,您必须指定一个值maxval.

忽略了位置争论

MATLAB允许你通过传递一个波浪字符()代替论点。您可以通过添加TILDE字符来定义忽略未使用的位置参数的函数()在与函数签名中的参数的位置对应的参数块中。添加波浪字符()对于函数签名中的每个忽略参数。

被忽略的参数不能有默认值或指定类、大小或验证函数。

波浪号字符()被视为可选的输入参数,除非它后跟所需的位置参数。例如,在此函数中,Tilde字符()表示一个可选参数。

功能c = f(〜)参数结尾%函数代码结尾

您可以使用没有参数调用此函数。

C = F.

或者您可以使用一个参数调用此函数。

c = f(2)

在以下函数中,Tilde字符()表示一个必需的参数。

功能c = f(〜,x)参数〜X.结尾%函数代码...结尾

这个函数的调用必须包含这两个参数。

c = f(2,3)

有关使用忽略输入调用函数的更多信息,请参阅忽略功能定义中的输入

重复参数

重复参数是可以将重复指定为输入参数的位置参数。声明重复参数参数包括包括的块重复属性。

参数(重复)arg1 arg2 ...结尾

函数只能拥有一个重复参数块,可以包含一个或多个重复参数。

定义一个函数重复参数可以调用块中的零或多个块中所有参数的块。如果对函数的调用包括重复参数,那么它的所有参数都包含在内重复参数必须包括每个重复的块。

例如,如果是重复参数块定义参数Xy,那么每个重复必须包含这两个Xy

重复参数无法指定默认值,因此不能是可选的。但是,您可以在不包括任何重复参数的情况下调用该函数。

函数必须在位置参数和名称值参数之前声明重复参数。您无法在a中指定名称值参数重复块。有关名称-值参数的信息,请参见名称 - 值参数

在该函数中,每个重复参数都成为一个单元数组,元素数等于函数调用中传递的重复数量。验证应用于单元格阵列的每个元素。如果使用此参数的零突出函数,则单元格数组的大小为1-0。也就是说,它是空的。

例如,此函数声明了一块三个重复参数,Xy, 和选项

功能[Xcell,Ycell,OptionCell] = Frepeat(X,Y,选项)参数(重复)x双倍的y双倍的选项{MustBemember(选项,[“线性”,“立方”))}}结尾%函数代码%返回单元阵列xcell = x;Ycell = Y;optionCell =选项;结尾

您可以使用无输入或三个输入的函数调用该函数。MATLAB为每个参数创建一个单元格数组,其中包含所有值为该参数的所有值。这个电话免费传递三个重复参数中的两组。

[Xcell,Ycell,OptionCell] = Frepeat(1,2,“线性”、3、4、“立方”
Xcell = 1×2单元阵列{[1]} {[3]} Ycell = 1×2单元阵列{[2]} {[4]} optionCell = 1×2单元阵列{[“线性”]} {[“立方体”]}

以下函数接受重复参数Xy输入中的输入重复参数块。在函数体中,作为重复参数指定的值可以在单元格数组中使用Xy.的值之间插入Xy将所需的输入匹配到阴谋功能:绘图(x1,y1,...)

功能myplotrepeating(x,y)参数(重复)x(1,:)双y(1,:)双结尾%函数代码%交错x和yz =重塑([x; y],1,[]);%调用plot函数如果~ isempty (z)情节(z {:});结尾结尾

使用重复的输入参数调用此函数。

x1 = 1:10;日元=罪(x1);x2 = 0:5;y2 =罪(x2);myPlotRepeating (x1, y1, x2, y2)

避免使用变长度输入宗量用于重复参数

使用变长度输入宗量不建议使用使用参数验证的函数。如果变长度输入宗量在重复参数块中受到大小或类,然后限制适用于所有值变长度输入宗量

如果你使用变长度输入宗量要支持金宝app遗留代码,它必须是唯一的参数重复参数块。

例如,此函数定义了两个所需的位置参数和变长度输入宗量作为重复论点。

功能F(a,b,varargin)参数一种uint32B.uint32结尾参数(重复)varargin结尾%函数代码...结尾

名称 - 值参数

名称-值参数将名称与传递给函数的值相关联。名称-值参数:

  • 可以以任何顺序传递给函数

  • 总是可选

  • 必须在所有位置和重复参数之后声明

  • 不能出现在一个参数块,使用重复属性

  • 必须使用唯一的名称,即使使用多个名称-值结构

  • 不能使用也用于位置参数的名称

声明名称值参数参数块使用点表示法定义结构的字段。例如,该结构命名namevalueargs.定义两个名称值参数,Name1Name2.您可以使用任何有效的MATLAB标识符作为结构名称。

参数namevalueargs.name1 namevalueargs.name2.结尾

结构名称必须出现在函数签名中。

功能myfunction(namevalueargs)

使用名称值结构中的字段名称调用函数。

myFunction(name1 = value1,name2 = value2)

在R2021a之前,传递名称时使用字符串或字符向量,名称和值之间用逗号分隔。两个语法都在稍后的版本中有效。

函数签名中使用的结构的名称是函数工作空间中的结构的名称,其中包含传递给函数的名称和值。

功能结果= myfunction(namevalueargs)参数namevalueargs.name1 namevalueargs.name2.结尾%函数代码结果= NameValueArgs。Name1* NameValueArgs.Name2;结尾
r = myfunction(name1 = 3,name2 = 7)
r = 21.

当没有歧义时,名称-值参数支持部分名称匹配金宝app。例如,一个函数定义线宽线型由于其两个名称值参数接受LineW线,但使用线导致错误。通常,使用全名是建议的做法,以提高代码可读性并避免意外行为。

名称-值参数的默认值

您可以为每个名称指定一个默认值。如果没有指定默认值,并且调用函数时没有名称-值参数,那么名称-值结构中不存在该字段。如果没有向函数传递名称-值参数,MATLAB将创建该结构,但它没有字段。

要确定在函数调用中传递了哪些名称值参数,请使用isfield功能。

例如,以下函数定义了两个所需的位置参数(宽度高度)和两个名称-值参数(线型线宽).在本例中选项结构有两个字段(线型线宽)在调用函数时,包含指定为名称值参数的默认值或值。

功能MyRectangle(宽度,高度,选项)参数宽度双倍的高度双倍的选项.LINESTYLE.(1,1)字符串=“ - ”选项.LineWidth.(1,1){mustbenumeric}= 1结尾%函数代码...结尾

所有这些语法都是调用此功能的有效方法。

MyRectangle(4,5)MyRectangle(4,5,Linestyle =":",LineWidth = 2)MyRectangle(4,5,LineWidth = 2,Linestyle =":")MyRectangle(4,5,Linestyle =":")MyRectangle(4,5,LineWidth = 2)

在R2021a之前,传递名称时使用字符串或字符向量,名称和值之间用逗号分隔。例如:

MyRectangle(4,5,“linestyle”":"“行宽”,2)MyRectangle(4,5,“行宽”2,“linestyle”":"

使用重复和名称值参数

如果函数定义重复参数,那么您必须在单独的名称中声明名称值参数参数遵循重复参数块的块。例如,此函数接受两个重复参数,Xy.在指定所有重复之后Xy,你可以指定一个name-value参数来赋值或者日志到了plottype.名称。

确定函数呼叫是否包括plottype.参数,使用isfield检查的功能plottype.字段规模结构。

功能linLog (x, y,规模)参数(重复)x(1,:)双y(1,:)双结尾参数scale.plottype.(1,1)字符串结尾z =重塑([x; y],1,[]);如果Isfield(比例,“plottype”如果scale.plottype ==.“林”绘图(z {:})elseifscale.plottype ==.“日志”重对数(z {:})结尾结尾结尾

使用或不包含名称值参数调用此函数。

MyLinlog(1:5,1:5,1:10,1:100:1000)MyLinlog(1:5,1:5,1:10,1:100:1000,plottype =“日志”

在R2021a之前,传递名称时使用字符串或字符向量,名称和值之间用逗号分隔。例如:

MYLINLOG(1:5,1:5,1:10,1:100:1000,“plottype”“日志”

多个名称结构

函数参数块可以包含多个名称值结构。但是,字段名称在所有结构中都必须是唯一的。此函数有两个名称值结构:lineOptions.fillOptions.这些结构不能有相同的字段名。

其中的论点MyRectangle.功能是:

  • 宽度高度是类型的位置争论双倍的

  • lineOptions。线型是一个标量字符串,具有默认值“ - ”

  • lineOptions。线宽是一个标量数字,默认值1

  • fillOptions。颜色是一个字符串。

  • fillOptions。模式对其价值没有限制。

功能myRectangle(宽度、高度、lineOptions fillOptions)参数宽度双倍的高度双倍的lineOptions。线型(1,1)字符串=“ - ”lineOptions。线宽(1,1){mustbenumeric}= 1 fillOptions.Color.字符串fillOptions。模式结尾%函数代码...结尾

来自类属性的名称值参数

MATLAB中一个有用的函数语法使用类的公共属性作为名称-值参数的名称。为类定义的所有可设置属性(即,带有public的所有属性)指定名称-值参数SetAccess),使用此语法参数堵塞:

structName.。?班级名称

函数可以使用“structName.。?班级名称“只有一次语法。因此,即使使用不同的类和结构名称,函数也可以仅定义从类中获取其字段名称的一个名称 - 值结构。

如果类别限制了通过使用属性验证可以分配给属性的值的限制,则该函数将验证应用于单个名称值参数。有关物业验证的信息,请参阅验证属性值

例如,此函数有两个必需的参数,Xy并接受任何公共属性名称和价值matlab.graphics.chart.primitive.Bar.Bar.类。

功能mybar(x,y,propargs)参数X(:,:) 双倍的y(:,:) 双倍的propargs.?matlab.graphics.chart.primitive.Bar.Bar.结尾propertyCell = namedargs2cell (propArgs);栏(x, y, propertyCell {:})结尾

使用所需的输入和任何可设置的属性名称 - 值对调用函数。

x =[1、2、3、4、5、6];y = x ^ 2;myBar (x, y) myBar (x, y, FaceColor =“红色”,barlayout =“分组”

在R2021a之前,传递名称时使用字符串或字符向量,名称和值之间用逗号分隔。例如:

mybar(x,y,“facecholor”“红色”“BarLayout”“分组”

覆盖特定属性

您可以通过在参数块中重新定义具有特定名称值参数的属性名称来覆盖类属性验证。

structName.。?班级名称structName.propertyname.(dim1,dim2,...)类名{fcn1,fcn2,...}

特定名称 - 值参数验证覆盖了单个指定属性名称按类定义的验证。

例如,下面的函数将名称-值参数定义为matlab.graphics.chart.primitive.Bar.Bar.类。该函数还会覆盖属性名称FaceColor仅允许这些特定值:红色的或者蓝色的

matlab.graphics.chart.primitive.Bar.Bar.类的默认值FaceColor这不是受限制值之一(红色的或者蓝色的).因此,覆盖声明必须分配满足限制的默认值MustBemember.验证功能。也就是说,默认值必须是红色的或者蓝色的

此函数将名称值结构转换为包含交错名称和值的单元格数组使用namedargs2cell.功能。

功能mybar(x,y,propargs)参数X(:,:) 双倍的y(:,:) 双倍的propargs.?matlab.graphics.chart.primitive.bar Propargs.faceColor.{mustbemmber(propargs.facecolor,{'红色','blue'})}=“蓝色的”结尾propertyCell = namedargs2cell (propArgs);栏(x, y, propertyCell {:})结尾

使用两个所需的参数调用函数,Xy.可选地通过条形功能支持的任何名称值对和值金宝appFaceColor可以是任意一种红色的或者蓝色的.其他的值FaceColor不允许。

x =[1、2、3、4、5、6];y = x ^ 2;mybar(x,y)mybar(x,y,facecholor =“红色”,barlayout =“被分组”)

类方法中的参数验证

验证方法输入参数在公共方法中很有用,因为对方法的调用可能不会源于类代码。您可以使用混凝土类方法中的函数参数验证,包括在抽象类中定义的具体方法。但是,抽象方法(类别不实现的方法)无法定义参数块。有关类方法的信息,请参见方法抽象班级和班级成员

如果一个classdef文件包含在单独文件中定义的方法的方法原型,包括参数在定义方法的单独文件中块。有关在单独文件中定义方法的详细信息,请参阅单独文件中的方法

子类方法不会继承函数参数验证。在覆盖超类方法的子类方法中,您可以将相同的参数验证添加到超类方法中使用的子类方法。

句柄类析构函数方法不能使用参数验证。一种命名的方法删除在包括一个包含一个的句柄子类中参数块未被视为析构函数。(换句话说,当对象被销毁时,Matlab不调用它)。有关类析构函数方法的更多信息,请参阅处理类析构函数

论证验证的顺序

调用函数时,MATLAB按照它们所示的顺序验证输入参数参数块,从上到下。在验证下一个参数之前,每个参数都完全验证。因此,对先前声明的参数的任何引用都使用已验证的值。函数由于第一个验证故障而抛出错误。

验证值可以与调用函数传递的原始值不同。例如,此功能将输入称为类uint32价值观。第三个输入声明分配等于前两个输入的乘积的默认值。

功能c = f(a,b,c)参数一种uint32B.uint32Cuint32= a。* b结尾%函数代码...结尾

使用具有不同数字类的输入调用函数(例如,双倍的)导致转换为uint32

c = f(1.8,1.5)

因为可选的输入参数C未在函数调用中指定,Matlab评估默认值并将其分配给C转换后一种B.uint32价值观。在这种情况下,转换导致两个输入的值为2。因此,产品的产品一种时代B.是四个。

c = uint32 4

如果为第三个输入指定值,则该函数将值分配给C并且不计算默认值表达式。

c = f (1.8, 1.5, 25)
C = UINT32 25

避免课堂和大小转换

在验证过程中,Matlab在调用任何验证函数之前应用类,然后在验证之前验证。如果默认值用于删除函数调用中省略的可选输入,则在应用验证过程中的任何步骤之前将此值分配给参数。

当传递给函数的参数值与验证所需的类和大小不匹配时,Matlab可能会将值转换为已声明的类和大小。但是,转换可能不是所需的行为。

下面是MATLAB可以执行的一些转换示例。

满足数字类限制:

  • 一种char值可以转换为其Unicode®数值。

  • 一种字符串可以转换为数字或如果字符串不是单个数字的表示。

满足规模限制:

  • 标量展开可以将大小从标量变为非标量。

  • 列向量可以转换成行向量。

为了消除MATLAB从输入参数验证中执行的标准转换,使用验证函数而不是类和大小限制。对验证函数的调用不返回值,也不能改变输入参数的值。

例如,此功能将第一个输入限制为类的任何大小的二维数组双倍的.第二个输入必须是任何类的5×3阵列。

功能f(a,b)参数一种(:,:) 双倍的B.(5,3)结尾%函数代码...结尾

由于标准的MATLAB类型转换和标量展开,您可以使用以下输入调用该函数而不会收到验证错误。

F('字符矢量',144)

默认情况下,MATLAB将字符向量的元素转换为它们的等效数值,并应用标量展开来从标量值创建一个5乘3的数组144

使用专用验证功能可以提供更具体的输入参数验证。例如,此函数定义其使用代替第一个和第二个参数的类和大小规范的专用验证功能。这些本地功能使您可以避免输入值转换。

  • Mustbeofclass.限制输入到特定的类,不允许转换或子类。对于相关功能,请参阅甘蔗

  • Mustbeequalsize.限制两个输入具有相同的大小而不允许标量扩展。对于相关功能,请参阅Mustbescalarreusemy.

  • mandbedims.将输入限制为指定的维度,而无需允许转发或标量扩展。对于相关功能,请参阅mustBeVector

功能fCustomValidators (a, b)参数一种{mustBeOfClass(“双”),mustBeDims (a, 2)}B.{MustBeequalsize(B,A)}结尾%函数代码...结尾%自定义验证器函数功能mustBeOfClass(输入类名)特定类名称的%测试cname = class(输入);如果〜Strcmp(CNAME,CLASSNAME)EID ='类:NotCorrectClass';msg = [“输入必须是类”cname);BrontcAller(MEXception(EID,MSG))结尾结尾功能Mustbeequalsize(a,b)%测试相同的大小如果~ isequal(大小大小(a)、(b))开斋节='尺寸:不等';msg =.'输入必须具有相同的大小。;BrontcAller(MEXception(EID,MSG))结尾结尾功能Masebedims(输入,NumDims)%测试尺寸的数量如果〜Isequal(长度(尺寸(输入)),numdims)EID =“大小:wrongDimensions”;msg = [输入必须有维度,num2str(numdims)];BrontcAller(MEXception(EID,MSG))结尾结尾

Mustbeofclass.函数通过要求与类名称匹配来强制匹配的严格类匹配。更普遍的方法可以使用isa.函数也匹配指定类的子类。

Mustbeequalsize.mandbedims.函数强制对输入参数进行严格声明。

FcustomValidators('字符矢量',144)
位置的输入参数无效1.输入必须是类双

在这个调用中,第一个输入的维数是错误的,因此验证函数返回一个自定义错误消息。

fCustomValidators ((2, 2, 4), 144)
位置1.输入的输入参数无效1.输入必须具有2个维度

Mustbeequalsize.验证器函数将第二个输入限制为一个特定的维度,该维度在错误消息中提供。

FcustomValidators((2,2),144)
位置的输入参数无效2.输入必须大小[5 3]

对于相关的预定义验证函数,请参阅甘蔗MustBefloat., 和mustBeVector

在论证验证中

函数返回在调用当前正在执行的函数时给出的函数输入参数的数量。当使用函数参数验证时,返回在函数中是调用函数时提供的位置参数的数量。

重复参数是位置参数,因此调用时传递给函数的重复参数的数量包含在

价值返回不包括函数调用中不包含的可选参数。还,不计算任何名称值参数。

确定调用时是否将可选的位置参数传递给函数。例如,这个函数声明了三个位置参数和一个名称-值参数。下面是函数如何确定在调用它时传递的参数。

  • 确定可选的位置参数是否C用一个函数传递给转变块。

  • isfield的名称-值参数格式传递给函数。

功能结果= fnargin(a,b,c,namedargs)参数一种(1,1)的两倍B.(1,1)的两倍C(1,1)的两倍= 1 namedargs.format.(1,:) char结尾%函数代码转变案件2结果= A + B;案件3结果= a ^ c + b ^ c;结尾如果Isfield(Namedargs,“格式”)格式(namedargs.format);结尾结尾

在这个函数调用中,值2

结果= fnargin(3,4)
结果= 7.

在这个函数调用中,值3.

结果= Fnargin(3,4,7.62)
结果= 4.3021E + 04

在这个函数调用中,值是3:

结果= fnargin(3,4,7.62,format =“银行”
结果= 43020.56.

变量和函数访问限制

参数函数的工作空间中存在块。使用函数范围的任何包,类或函数使用进口命令被添加到范围内参数块。

验证器函数和默认值表达式唯一可见的变量是已经声明的输入变量。在此函数中,的默认值C来自一种B.

功能c = f(a,b,c)参数一种uint32B.uint32Cuint32= a * b结尾%函数代码...结尾

但是,您无法引用尚未声明的输入变量参数块。例如,使用此声明作为参数一种在以前的函数中无效,因为B.C还没有宣布。

参数UINT32 = B * C B UINT32 C UINT32结尾

参数验证表达式只能引用以前声明,因此验证了参数。名称值参数的验证函数和默认值无法访问其他名称值参数。

函数的限制参数堵塞

对先前声明的参数的任何引用必须在验证函数和默认值的文本中可见。为确保代码透明度,请勿使用与功能工作空间交互的函数。具体地,请勿使用嵌套函数或下表中列出的任何功能参数块。

赋予 内置 清除
DBStack. 求解 evalc
评价 存在 Feval.
输入 InputName. 加载
narginchk Nargoutchk.
保存 谁是 WHO

这些限制只适用于参数块,不适用于功能主体中的变量或函数。

调试参数块

在调试参数块中,否则工作空间是只读.这意味着可以检查工作空间并查看分配给变量的值。但是,不可能创建新的变量或将分配给现有变量的值更改为仅在读取工作空间时。一旦调试器位于参数块之外,它将再次创建或编辑变量。

也可以看看

|

相关的话题