说明
为了更方便灵活的使用matlab函数,常常需要设置默认参数,以及得到可变个数的返回值。这就需要使用到
varargin
,
varargout
,
nargin
,
nargout
等内置函数。
varargin
是“Variable length input argument list”的缩写,它提供了一种函数可变参数列表机制,允许调用者调用该函数时根据需要来改变输入参数的个数。
varargout
是“Variable length output argument list”的缩写,可以得到可变个数的函数返回值。
nargin
是“number of input arguments”的缩写。 在函数体内部,
nargin
用来判断输入变量的个数。
nargout
是“number of output arguments”的缩写。 在函数体内部,
nargout
指出了输出参数的个数。
实例
这里我们的需求是给出一个函数,用于计算输入数组的平均值和中位值。默认不去掉最大值和最小值,当输入相关参数时,去掉最大值和最小值。当输出变量只有1个时,输出平均值,输出变量为2个时,输出平均值和中位数。
暂且把函数名叫
meanmedian
,目标要实现下列调用:
[mean_data,median_data] = meanmedian(data);
mean_data = meanmedian(data);
mean_data = meanmedian(data,true) % true 设置去掉最大值最小值
去除最大值和最小值的需求,可以设置一个参数
rm
,默认
rm = false
,即不去除。用户可以在调用函数时输入该参数来选择去除最大值和最小值。可以通过
nargin
来简单设置或者通过
varargin
设置输入解析器来实现。
通过nargin设置默认参数
function varargout = meanmedian2(data,rm)
if nargin == 1
rm = false;
end
if rm
data(data==max(data))=[];
data(data==min(data))=[];
end
...
return
这时调用函数时可以通过meanmedian(data,true)来指定去掉最大值最小值。若不指定meanmedian(data),则默认不去掉最大值最小值。
通过函数解析器设置默认参数
p = inputParser;
addParameter(p,'rm',false);
parse(p,varargin{:});
rm = p.Results.rm;
这时,如果指定的
rm
值,则需要指定变量名meanmedian(data,‘rm’,ture)。
函数解析器的优点是便于设置多个默认参数
,指定参数时输入参数名即可,而不必严格按照顺序指定。
设置可变输出个数
可变输出变量可以通过函数内部的
nargout
和
varargout
来指定。
if nargout == 1
varargout{1} = meandata;
elseif nargout == 2
varargout{1} = meandata;
varargout{2} = mediandata;
end
这时即可实现可变个数的变量输出:
[mean_data,median_data] = meanmedian(data);
mean_data = meanmedian(data);
函数代码
function varargout = meanmedian(data,varargin)
% get the mean and median
% usage: [mean_data,median_data] = meanmedian(data)
% usage: mean_data = meanmedian(data)
% remove the maximum and minimum values through optional parameters 'rm',
% default rm = false
% usage: mean_data = meanmedian(data,'rm',true)
%
% Yuechu Wu
% 12131066@mail.sustech.edu.cn
% 2023-03-08
% set up input parser, default rm = false
p = inputParser;
addParameter(p,'rm',false);
parse(p,varargin{:});
rm = p.Results.rm;
if rm
data(data==max(data))=[];
data(data==min(data))=[];
end
meandata = mean(data);
mediandata = median(data);
if nargout == 1
varargout{1} = meandata;
elseif nargout == 2
varargout{1} = meandata;
varargout{2} = mediandata;
end
return