MATLAB的函数参数

本节介绍一下 MATLAB 的函数参数。具体的操作步骤如下:

确定函数参数数量

当调用一个函数时,所用的输入变量和输出变量的数量,在函数内是确定的。nargin 函数确定输入变量个数,nargout 函数确定输出变量个数。

示例1

nargin 函数和 nargout 函数的使用,具体程序如下:
function c = testarg1(a, b)
if(nargin == 1)
    c = a .^ 2;
elseif(nargin == 2)
    c = a + b;
end
如果用户使用一个参数调用 testarg 1 函数,则函数计算输入值的平方;如果使用两个参数调用 testarg 1 函数,则函数计算输入值之和。

传递可变数量的参数

varargin 和 varargout 函数允许编程者传递可变数量的变量给函数或者让函数返回可变数量的变量。

MATLAB 封装所有的输入变量为单元数组返回 varargin,封装所有的输出变量为单元数组返回 varargout。

示例2

varargin 函数的使用,具体程序如下:
function [xmin, ymin]=testvar(varargin)
for k = 1:length(varargin)
    x(k) = varargin{k}(1)    %单元数组索引
    y(k) = varargin{k}(2);
end
xmin =min(x);
ymin =max(y);
testvar 函数可以调用具有不同数量的输入变量,如下所示。
>> [a,b]=testvar([2 3],[1 5],[4 8],[6 5],[4 2],[2 3]);    %函数共有6个输入
a=
    1
b=
    8
在函数执行过程中,varargin={[2 3],[1 5],[4 8],[6 5],[4 2],[2 3]},函数调用完毕 varargin 释放。

示例3

varargout 函数的使用,具体程序如下:
function [varargout] = testvar2(arrayin)
for k = 1:nargout
varargout{k} = arrayin(k,:);    % Cell array assignment
end
testvar2 函数返回数组 arrayin 的每一行,如下所示。
>> a = [1 2; 3 4; 5 6; 7 8; 9 0];
>> [p1, p2, p3, p4, p5] = testvar2(a)
p1=
    1  2
p2=
    3  4
p3=
    5  6
p4=
    7  8
p5=
    9  0
vargin 和 vargout 函数可以出现在输入输出变量列表的末尾,函数调用时必须指定需要的输入和输出变量,如下所示。
function [out1,out2] = example1(a,b,varargin)
function [i,j,varargout] = example2(x1,y1,x2,y2,flag)

向嵌套函数输入可变变量

1) varargin 和 varargout。
由于嵌套函数与主函数使用相同的函数工作区,因此,varargin 和 varargout 既可以表示嵌套函数的输入输出变量,也可以是主函数的输入输出变量,具体表示取决于程序中的变量声明。

如果嵌套函数在函数声明中包含 varargin 或 varargout,则在函数内部调用这两个变量时,变量内容为该函数的输入输出变量;如果嵌套函数声明中没有包含 varargin 或 varargout,而在该函数的上层函数声明中包含 varargin 或者 varargout,则当在该嵌套函数内部调用这两个变量时,变量内容为上层函数的输入输出变量。

示例4

varargin 和 varargout 的取值,具体程序如下:
function x = A(y, varargin)    % Primary function A
B(nargin, y * rand(4))
function B(argsIn, z)    % Nested function B
if argsIn >= 2
C(z, varargin{1}, 4.512, 1.729)
end
function C(varargin)    % Nested function C
if nargin >= 2
x = varargin{1}
end
end % End nested function C
end % End nested function B
end % End nested function B 
在函数 A 中,函数 C 嵌套在函数 B 中,函数 B 嵌套在函数 A 中,在函数 B 中调用 varargin{1} 表示主函数 A 的第二个变量(函数 A 的第一个参数为 y),而在函数 C 中的 varargin{1} 表示函数 B 传递给函数 C 的第一个参数,即 z。

函数 A 调用 nargin(B(nargin,y*rand(4))) 表示函数 A 的输入变量个数,在函数 C 中调用 nargin 表示函数 C 的输入变量个数。

2) nargin 和 nargout。
当在函数中调用 nargin 和 nargout 函数时,其值为该函数的输入或输出变量,而不需要进行声明。

示例5

nargin 和 nargout 的取值,具体程序如下。
function meters = convert2meters(miles, varargin)
% Converts MILES (plus optional FEET and INCHES input)
% values to METERS.
if nargin < 1 || nargin > 3
    error('1 to 3 input arguments are required');
end
function feet = convert2Feet(argsIn)
% Nested function that converts miles to feet and adds in
% optional FEET argument.
feet = miles .* 5280;
if argsIn >= 2
    feet = feet + varargin{1};
end
end % End nested function convert2Feet
function inches = convert2Inches(argsIn)
% Nested function that converts feet to inches and adds in
% optional INCHES argument.
inches = feet .* 12;
if argsIn == 3
    inches = inches + varargin{2};
end
end % End nested function convert2Inches
feet = convert2Feet(nargin);
inches = convert2Inches(nargin);
meters = inches .* 2.54 ./ 100;
end % End primary function convert2meters
>> convert2meters(5)
ans =
    8.0467e+003
>> convert2meters(5, 2000, 4.7)
ans =
    8.6564e+003