varargin、varargout、nargin和nargout的使用方法
由于使用MATLAB的频率越来越多,一些基本的技巧和使用需要熟悉,先从简单入手吧。
技巧实现
函数输入和输出参数个数确定的情况
在这种情况下,用户可以按照如下方式来定义函数:
myfun.m
函数文件:
function [out1 out2 out3]=myfun(in1, in2)
out2=in1+in2; %两数和
out3=20; %设置out3为20
out1=in1.^2; %out2为in1的平方
函数带有2个输入参数和3个输出参数,虽然在函数体内,变量的计算顺序是out2、out3、和out1,但函数的返回顺序是out1、out2和out3,与返回参数在函数体内的计算顺序无关。
此外,实际调用函数时,其返回参数的个数可以少于函数定义的返回参数的个数。例如:函数myfun可以返回1个参数、2个参数或3个参数。
有关函数myfun的返回值问题:
%调用时无返回参数,这时默认返回第1个输出参数的值
>> myfun(10,20)
ans = 100
%调用时带一个返回参数,返回第1个输出参数的值
>> [valuel]=myfun(10,20)
valuel = 100
%调用时带2个返回参数,返回前2个输出参数的值
>> [value1 value2]=myfun(10,20)
value1 = 100
value2 = 30
%调用时带3个返回参数,返回3个输出参数的值
>> [value1 value2 value3]=myfun(10,20)
value1 = 100
value2 = 30
value3 = 20
函数的输入和输出参数个数不确定的情况
在这种情况下,Matlab语言可以使用varargin
和varargout
结构来定义函数的输入和输出参数,并使用nargin
和nargout
来获取函数调用时输入参数和输出参数的个数。
varargin 和 varargout
利用varargin和varargout可以传递任意数目的输入参数和输出参数。
varargin(variable length input argument list)和varargout(variable length output argument list)都是可变长度的元胞数组,是MATLAB预定义的专用参数,可以分别用来存储函数的输入参数和输出参数。它们是在函数的输入和输出参数个数不确定的情况下使用,也就是可以应用到可变输入输出参数的函数中。
varargin有两种情况:
function myfun(varargin)
第一种情况,函数被调用时,MATLAB使用varargin{1}来接收函数的第1个输入值,varargin{2}来接收函数的第2个输入值,依次类推。
function myfun(in1, in2, varargin)
第二种情况,函数的第1个和第2个输入值由in1和in2来接收,varargin{3}接收函数的第3个输入值,varargin{2}接收函数的第4个输入值,依次类推。
varargout也有两种情况:
function varargout=myfun(in1,in2,…)
函数被调用时,MATLAB使用varargout{1}接收第1个返回值,varargout{2}来接收第2个返回值,依次类推。
function [out1 out2 varargout]=myfun(in1,in2,…)
函数被调用时,MATLAB使用out1和out2分别接收第1和第2个返回值,varargout{1}接收第3个返回值,varargout{2}来接收第4个返回值,依次类推。
注:varargin和varargout只用于包含可选参数的函数当中,在声明时,varargin和varargout必须作为最后一个参数声明,在声明中必须小写。正确的使用格式如下:
function [out1 out2 varargout] = myfun(in1, in2, varargin)
要取得varargin和varargout中的参数,可以使用varargin{1}、varargin{2}、varargout{1}、varargout{2}等。
nargin 和 nargout
在一个函数M文件内,调用nargin或nargout可以确定用户调用函数时设置了多少个输入参数和输出参数。
nargin和nargout可以带有一个输入参数。该输入参数是一个函数名,用来确定该函数的输入和输出参数的个数,如nargin(fun)和nargout(fun)。
nargin 和 varargin 使用示例
vartest.m
代码如下:
% 定义函数vartest,带2个独立输入参数和1个varargin数组
function vartest(inputArg1,inputArg2,varargin)
% 取得varargin中元素的个数
optargin=size(varargin,2);
% 由nargin得到函数总的输入值的个数,从而求得在独立参数中的输入值的个数
stdargin=nargin-optargin;
fprintf('函数的输入值个数为:%d\n',nargin)
fprintf('独立参数中的输入值个数为: %d\n',stdargin)
end
命令行调用,结果如下:
>>vartest(2,4,35,543,2)
函数的输入值个数为:5
独立参数中的输入值个数为: 2
nargout 和 varargout 使用示例
mysize.m
代码如下:
function [s,varargout]=mysize(x)
% 调用nargout命令取得调用函数时返回参数的个数
out1=nargout;
% 确定varargout中元素个数
nout=max(out1,1)-1;
% 将输入数组的行数和列数组成的数组赋值给输出参数s
s=size(x);
% 分别将输入数组的行数和列数保存到varargout中
for k = 1:nout
varargout(k)={s(k)};
end
命令行调用,结果如下:
>> [s,rows,cols]=mysize([1 2 3; 3 4 5])
s = 2 3
rows = 2
cols = 3
函数名作为nargin 和 nargout的输入参数
如果将函数名作为nargin和nargout的输入参数,则返回的是函数定义的输入参数和输出参数的个数,即函数的形参的个数。
定义myfunc.m
文件:
function out = myfunc(in1,in2,in3)
num1 = nargin;
num2 = nargout;
end
命令行调用,结果如下:
>> num1=nargin('myfunc')
num1 = 3
>> num1=nargout('myfunc')
num1 = 1