首页 > 编程笔记 > MATLAB笔记 阅读:55

MATLAB函数参数传递详解(附带实例)

在 MATLAB 中通过 M 文件编写函数时,只需要指定输入和输出的形式参数列表,只有在函数实际被调用的时候,才需要把具体的数值提供给函数声明中的输入参数。

MATLAB 中参数传递过程是值传递,也就是说,在函数调用过程中,MATLAB 将传入的实际变量值赋给形式参数指定的变量名,这些变量都存储在函数的变量空间中,该空间和工作区变量空间是分开的,每一个函数在调用中都有自己独立的变量空间。

例如,编写函数:
function y = myfun(x, y)
在命令行窗口中通过 a=myfun(3, 2) 调用此函数,那么 MATLAB 首先会建立 myfun 函数的变量空间,把 3 赋值给 x,把 2赋值给 y,然后执行函数代码,在执行完毕后,把 myfun 函数返回的参数 y 的值传递给工作区变量 a。调用过程结束后,函数变量空间被释放。

输入输出参数的数目

MATLAB 的函数可以具有多个输入或输出参数。通常在调用时,需要给出和函数声明语句中一一对应的输入参数;而输出参数数目可以按参数列表对应指定,也可以不指定。

若调用函数时不指定输出参数,则 MATLAB 默认把输出参数列表中的第一个参数的数值返回给工作区变量 ans。

在 MATLAB 中可以通过 nargin 和 nargout 函数,确定函数调用时实际传递的输入和输出参数的个数,结合条件分支语句,就可以处理函数调用中指定不同数目的输入、输出参数的情况。

【实例】输入和输出参数的数目。在编辑器中编写以下程序,并保存为 dingtha.m 函数。
function [n1,n2] = dingtha(m1,m2)
if nargin == 1          % 仅传入 1 个参数
    n1 = m1;
    if nargout == 2
        n2 = m1;
    end
else                    % 传入 2 个参数
    if nargout == 1
        n1 = m1 + m2;
    else
        n1 = m1;
        n2 = m2;
    end
end

在命令行窗口中输入以下语句,并查看输出结果:
>> m = dingtha(6)
m =
     6
>> [m,n] = dingtha(6)
m =
     6
n =
     6
>> m = dingtha(3,9)
m =
    12
>> [m,n] = dingtha(3,9)
m =
     3
n =
     9
>> dingtha(3,9)
ans =
     3
指定了输入和输出参数数目的调用情况比较好理解,只要对照函数文件中对应的 if 分支项即可;而对不指定输出参数数目的调用情况,MATLAB 是按照指定了所有输出参数的调用格式对函数进行调用的,不过在输出时只把第一个输出参数对应的变量值赋给工作区变量 ans。

可变数目的参数传递

使用函数 nargin 和 nargout 并结合条件分支语句,可以处理具有不同数目的输入和输出参数的函数调用,但这要求对每一种输入参数和输出参数组合分别进行代码编写。

有些情况下,用户可能并不能确定具体调用中传递的输入参数或输出参数的数目,即具有可变数目的传递参数,MATLAB 中可通过 varargin 和 varargout 函数实现可变数目的参数传递,使用这两个函数对于处理具有复杂的输入输出参数组合的情况也是便利的。

函数 varargin 和 varargout 把实际函数调用时传递的参数值封装成一个元胞数组,因此,在函数实现部分的代码编写中,就要用访问元胞数组的方法访问封装在函数 varargin 和 varargout 中的元胞或元胞内的变量。

【实例】可变数目的参数传递。在编辑器中编写以下程序,并保存为 myth.m 函数。
function y = dingthb(x)
a = 0;
for i = 1:length(x)
    a = a + mean(x{i});   % 计算每个元胞元素的均值并累加
end
y = a / length(x);        % 计算均值的均值

函数dingthb以x作为输入参数,从而可以接收可变数目的输入参数,函数实现部分首先计算了各个输入参数(可能是标量、一维数组或二维数组)的均值,然后计算这些均值的均值。

在命令行窗口中输入以下语句,并查看输出结果:
>> dingthb([5 3 4 1 8])
ans =
    4.2000

>> dingthb(5)
ans =
     5

>> dingthb([5 2; 9 6])
ans =
     7

>> dingthb(magic(5))
ans =
    13

返回被修改的输入参数

前文已讲过,MATLAB 函数有独立于工作区的变量空间,因此在函数内部对输入参数的修改只影响函数内部的变量空间。这些修改的生命周期与函数调用的生命周期相同。如果不将修改后的值通过返回值传递到工作区或其他变量,函数调用结束后,这些修改会被自动清除,不会影响到工作区中的变量。

【实例】函数内部的输入参数修改。在编辑器中编写以下程序,并保存为 dingthc.m 函数。
function y = dingthc(x)
x = x + 2;      % 修改输入参数
y = x .^ 2;     % 计算平方
在 dingthc 函数内部,首先修改输入参数 x 的值(x=x+2),然后用修改后的 x 值计算输出参数 y 的值(y=x.^2)。

在命令行窗口中输入以下语句,并查看输出结果(注意 x 的值是否发生变化):
>> x = 6
x =
     6
>> y = dingthc(x)
y =
    64
>> x
x =
     6
由此可见,调用结束后,函数变量空间中的 x 在函数调用中被修改,但此修改只在函数变量空间中有效,这并没有影响到 MATLAB 工作区变量空间中的变量 x 的值,函数调用前后,MATLAB 工作区中的变量 x 的值始终为 6。

如果希望函数内部对输入参数的修改也对MATLAB工作区的变量有效,就需要在函数输出参数列表中返回此输入参数。对上例中的函数,需要把函数修改为 function [y,x]=dingthc(x),而在调用时也要通过 [y,x]=dingthc(x) 语句调用。

【实例】将修改后的输入参数返回给 MATLAB 工作区。在编辑器中编写以下程序,并保存为 dingthd.m 函数。
function [y,x] = dingthd(x)
x = x + 2;      % 修改输入参数
y = x .^ 2;     % 计算平方
在命令行窗口中输入以下语句,并查看输出结果:
>> x = 6
x =
     6
>> [y,x] = dingthd(x)
y =
    64
x =
     8
>> x
x =
     8
由此可见,函数调用后,MATLAB 工作区中的变量 x 的值从 6 变为 8,表明通过 [y,x]=dingthc(x) 调用,实现了函数对 MATLAB 工作区变量的修改。

相关文章