Matlab中的参数定义

发布于:2024-04-06 ⋅ 阅读:(118) ⋅ 点赞:(0)

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

    % 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 或大于 maxArgsnarginchk 将引发错误。如果输入数目在 minArgsmaxArgs 之间(包括二者),则 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)
    
  • nargout

  • 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 或大于 maxArgsnargoutchk 将引发错误。如果输出数目在 minArgsmaxArgs 之间(包括二者),则 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 的任何数据类型,包括 int8int16int32int64uint8uint16uint32uint64singledouble
'<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

参考

参数定义 - MATLAB & Simulink

检查数组的有效性 - MATLAB validateattributes - MathWorks 中国


网站公告

今日签到

点亮在社区的每一天
去签到