Matlab中的参数定义
写在前面
Matlab是一种非类型化语言,大多数函数都不需要参数声明或验证。但是为了保证程序的通用性和按照预期工作,对参数进行验证是非常有必要的。
参数量验证
参数量验证是为了验证输入输出参数的数量
- 所用到的函数
% 可变长度输入参数列表
varargin
% 函数输入参数数目
nargin
% 验证输入参数数目
narginchk
% 可变长度的输出参数列表
varargout
% 函数输出参数数目
nargout
% 验证输出参数数目
nargoutchk
实际使用
varargin
可变长度输入参数列表,用在函数声明的最后一个参数,表示函数可接受任意长度参数输入,并且以1*N的元组形式存储。varargin
是函数定义语句中的一个输入变量,允许函数接受任意数量的输入参量。使用小写字符指定varargin
。在任何显式声明的输入项后,附加varargin
作为最后一个输入参量。在执行函数时,
varargin
是一个 1×N 元胞数组,其中 N 是函数在显式声明的输入后收到的输入项数。如果该函数在显式声明的输入后未收到任何输入,则varargin
是空元胞数组。% 将输入参数进行累加 function sum = mySum_varargin(varargin) disp("输入参数总量:" + nargin) % 输入参数的总量 sum = 0; for i = 1 : length(varargin) sum = sum + varargin{i}; % 元组可通过{i}访问元素 end end %% 调用 mySum_varargin(1.2,2.5,pi)
-
% nargin 在函数内部当作变量使用返回输入参数的数量 function sum=mySum(a,b) nargin % 这里 nargin = 2 sum = a + b; end % nargin('mySum') 返回函数mySum输入参数的数量,注意这里是函数字符串 % nargin() 若返回负数,则表示输入参数是可变参数,如-1:第一个参数是参数数, -3:第三个参数是可变参数 nargin('mySum') % nargout 在函数内部
narginchk(minArgs,maxArgs)
验证当前执行的函数调用中的输入参量数目。如果调用中指定的输入数目小于minArgs
或大于maxArgs
,narginchk
将引发错误。如果输入数目在minArgs
与maxArgs
之间(包括二者),则narginchk
不会执行任何操作。% 将输入参数进行累加 function sum = mySum_varargin(varargin) disp("输入参数总量:" + nargin) % 输入参数的总量 narginchk(2,5); % 输入参数数量的小于2大于5 sum = 0; for i = 1 : length(varargin) sum = sum + varargin{i}; % 元组可通过{i}访问元素 end end
varargout
是函数定义语句中的一个输出变量,允许函数返回任意数量的输出参量。使用小写字符指定varargout
,将其作为最后一个输出参量附加在任何显式声明的输出后。在执行此函数时,varargout
是一个 1×N 元胞数组,其中 N 是显式声明的输出结果后请求的输出数量。在函数内部,varargout
是一个未初始化且未预分配的变量。function varargout = mySum_varargout(varargin) disp("输入参数总量:" + nargin); disp("输出参数总量:" + nargout); narginchk(2,5); % 输入参数数量的小于2大于5 nargoutchk(1,2); % 输出参数数量1或2 sum = 0; for i = 1 : length(varargin) sum = sum + varargin{i}; % 元组可通过{i}访问元素 end varargout{1} = sum; if nargout>1 % 多个参数返回时最后一个参数为参数长度 count = length(varargout) + 1; varargout{count} = count; end end % 调用 [sum, count]= mySum_varargout(1.2,2.3,25)
Matlab
函数多个参数的输出原则是,接收的参数可以少,但不能多(返回不存在的参数)。% 在函数内部表示返回参数输出参数数量,值得注意的是输出参数的数量由外部接收返回值的参数数量决定 function sum = mySum_varargin(varargin) disp("输入参数总量:" + nargin); disp("输出参数总量:" + nargout); sum = 0; for i = 1 : length(varargin) sum = sum + varargin{i}; end end % 调用函数 mySum_varargin(1.2,2.3,25); % 输出参数个数 0 sum = mySum_varargin(1.2,2.3,25) % 输出参数个数 1
nargoutchk(minArgs,maxArgs) 验证当前函数调用中指定的输出参量的数目。如果输出数目小于
minArgs
或大于maxArgs
,nargoutchk
将引发错误。如果输出数目在minArgs
与maxArgs
之间(包括二者),则nargoutchk
不会执行任何操作。% 将输入参数进行累加 function sum = mySum_varargin(varargin) disp("输入参数总量:" + nargin); disp("输出参数总量:" + nargout); narginchk(2,5); % 输入参数数量的小于2大于5 nargoutchk(1,1); % 输出参数数量为 1 sum = 0; for i = 1 : length(varargin) sum = sum + varargin{i}; % 元组可通过{i}访问元素 end end
数组有效性检查
数组有效性检查使用
validateattributes()
函数来完成,可验证数组是否为指定的属性,不符合条件将显示一条格式化的错误消息,否则,不做任何输出。validateattributes(A,classes,attributes) % 检查数组A是否满足classes指定的有效数据类型和attributes指定的数据有效性 validateattributes(A,classes,attributes,argIndex) % argIndex将输入位置包含在函数参数列表作为生成的错误消息的一部分。 validateattributes(A,classes,attributes,funcName) % funcName将指定的函数名称包括在生成的错误标识符中。 validateattributes(A,classes,attributes,funcName,varName) % varName将指定的变量名称包括在生成的错误消息中。 validateattributes(A,classes,attributes,funcName,varName,argIndex) % 将指定的信息包括在生成的错误消息或标识符中。
被检查数据类型
single
| double
| int8
| int16
| int32
| int64
| uint8
| uint16
| uint32
| uint64
| logical
| char
| string
| struct
| cell
| function_handle
有效数据类型
classes
— 有效数据类型 字符向量 | 字符向量元胞数组 | 字符串数组,有效属性类型,指定为字符向量、字符向量元胞数组或字符串数组。classes
的每个元素都可以是任何内置或自定义类的名称,包括:
'half' |
半精度数 |
---|---|
'single' |
单精度数 |
'double' |
双精度数 |
'int8' |
有符号 8 位整数 |
'int16' |
有符号 16 位整数 |
'int32' |
有符号 32 位整数 |
'int64' |
有符号 64 位整数 |
'uint8' |
无符号 8 位整数 |
'uint16' |
无符号 16 位整数 |
'uint32' |
无符号 32 位整数 |
'uint64' |
无符号 64 位整数 |
'logical' |
逻辑值 1 (true ) 或 0 (false ) |
'char' |
字符 |
'string' |
字符串数组 |
'struct' |
结构体数组 |
'cell' |
元胞数组 |
'table' |
表 |
'timetable' |
时间表 |
'function_handle' |
函数句柄 |
'numeric' |
isa(A,'numeric') 函数为其返回 true 的任何数据类型,包括 int8 、int16 、int32 、int64 、uint8 、uint16 、uint32 、uint64 、single 或 double |
'<class_name>' |
任何其他类名 |
有效属性
attributes
— 有效属性 元胞数组 | 字符串数组,有效属性,指定为元胞数组或字符串数组。某些属性还需要数值,例如,用于指定 A
的元素的大小或数量的属性。对于这些属性,数值或向量必须紧跟在元胞数组中的属性名称的后面。字符串数组不能用于表示 attributes
中的数值。这些属性描述数组 A
的大小和形状。
'2d' |
二维数组,包括标量、向量、矩阵和空数组 |
---|---|
'3d' |
维度不大于三的数组 |
'column' |
列向量,N ×1 |
'row' |
行向量,1×N |
'scalar' |
标量值,1×1 |
'scalartext' |
字符串标量或字符向量,包括无任何字符的输入 |
'vector' |
行或列向量,或标量值 |
'size', [d1,...,dN] |
维度为 d1 -×-…-×-dN 的数组。要跳过检查特定维度的步骤,请为该维度指定 NaN ,例如 [3,4,NaN,2] 。 |
'numel', N |
具有 N 个元素的数组 |
'ncols', N |
具有 N 列的数组 |
'nrows', N |
具有 N 行的数组 |
'ndims', N |
N 维数组 |
'square' |
方阵;换句话说,行数和列数相等的二维数组 |
'diag' |
对角矩阵 |
'nonempty' |
不存在为零的维度 |
'nonsparse' |
非稀疏数组 |
这些属性为 A
中的值指定有效范围。
'>', N |
大于 N 的所有值 |
---|---|
'>=', N |
大于或等于 N 的所有值 |
'<', N |
小于 N 的所有值 |
'<=', N |
小于或等于 N 的所有值 |
'finite' |
所有值均为有限值 |
'nonnan' |
没有 NaN 值(非数字) |
这些属性检查数值数组或逻辑数组 A
中值的类型。
'binary' |
由一和零组成的数组 |
---|---|
'even' |
由偶数(包括零)组成的数组 |
'odd' |
由奇数组成的数组 |
'integer' |
由整数值组成的数组 |
'real' |
由实数值组成的数组 |
'nonnegative' |
没有小于零的元素 |
'nonzero' |
没有等于零的元素 |
'positive' |
没有小于或等于零的元素 |
'decreasing' |
一列中的每个元素均小于其前面的元素,且无 NaN 元素。 |
'increasing' |
一列中的每个元素均大于其前面的元素,且无 NaN 元素。 |
'nondecreasing' |
一列中的每个元素均大于或等于其前面的元素,且无 NaN 元素。 |
'nonincreasing' |
一列中的每个元素均小于或等于其前面的元素,且无 NaN 元素。 |
举例说明
function sum = varValid(a,b)
% 实数值组成的1*1标量数组,错误时显示错误的文件名以类型名
validateattributes(a, { 'numeric' }, {'real', 'scalar'}, mfilename, 'a');
validateattributes(b, { 'numeric' }, {'real', 'scalar'}, mfilename, 'b');
sum = a+b;
end
% 调用
varValid(2,5) % 正常调用
varValid('2','5') % 输入错误参数
% 可将'a'替换为inputname(1),此函数会返回输入参数名(如果变量存在的话)
validateattributes(a, { 'numeric' }, {'real', 'scalar'}, mfilename, inputname(1));
% 调用
a = '2';
b = '5';
varValid(a,b); % 输入错误参数
文本有效性检查
- 数组有效性检查使用
validatestring()
函数来完成
matchedStr = validatestring(str,validStrings) % 根匹配文本validStrings验证str的有效性
matchedStr = validatestring(str,validStrings,argIdx) % argIndex将输入位置包含在函数参数列表作为生成的错误消息的一部分。
matchedStr = validatestring(str,validStrings,funcName) % funcName将指定的函数名称包括在生成的错误标识符中。
matchedStr = validatestring(str,validStrings,funcName,varName) % varName将指定的变量名称包括在生成的错误消息中。
matchedStr = validatestring(str,validStrings,funcName,varName,argIdx) % 将指定的信息包括在生成的错误消息或标识符中。
- 其实这个有效性检查很简单,提供一个有效列表
validStrings
如果str
与与其逐一比较有相同的则有效。 - 其中有几种匹配情况,完全匹配、部分匹配(前导部分),最短匹配(匹配到多个返回最短的),无匹配。
举例说明
% 检查文本有效性
shape = validatestring(shape, {'sqrt', 'normal'}, '', 'SHAPE', 4); % 检查输入参数 sqrt normal