函数

MATLAB提供了很多内部数学函数,包括abs、sqrt、exp和sin等。对负数取平方根或取对数不会导致错误,MATLAB会自动返回复数计算结果。MATLAB还提供了很多高级的数学函数,包括bessel和gamma函数等。这些函数中的大部分函数都接受复数参数。在命令窗口中输入下面的命令,可以查看此类函数的列表:[大谦MATLAB,dqmatlab点com]

code.matlab
help elfun

输入下面的命令行,可以找到更多的高级数学函数和矩阵函数:

code.matlab
help specfun
help elmat

有些函数,如sqrt和sin,是内部函数,内部函数是MATLAB内核的一部分,所以它们的计算效率很高,但无法获取计算细节。其他函数,如gamma和sinh,是用M文件实现的。内部函数和其他函数有一些不同,例如,对于内部函数,无法看到代码;对于其他函数,则可以看到代码,甚至可以修改代码。

主函数

任何M文件中的第1个函数都被称为主函数。主函数后面可以有任意多个子函数。

在大多数情况下,主函数是M文件中可以从MATLAB命令行或从另一个M文件函数中调用的唯一函数。在调用该函数时,使用定义该函数的M文件的名称。

【例3-6】位于文件average.m中的average函数如下:

code.matlab
function y = average(x)
% 计算矢量元素的平均值
y = sum(x)/length(x);

可以用如下MATLAB命令行的命令计算3个数的平均值。

code.matlab
average([12 60 42])

注意:一般要使主函数名与M文件名相同。如果主函数名与文件名不同,则必须用文件名调用主函数。

子函数

M文件中可以包含一个以上的函数。在M文件中,除主函数外的其他函数被称为子函数,并且它们只对主函数或同一个文件中的其他子函数可见。

将主函数放在最上面,子函数放在下面,各子函数不分先后顺序。

【例3-7】

子函数mean和median用来计算输入数据的均值和中值。主函数newstats确定参数列表的长度并调用子函数,并将列表长度n传递给它们。

code.matlab
function [avg, med] = newstats(u) % 主函数
   % 本函数用内部函数计算均值和中值
   n = length(u);
   avg = mean(u, n);
   med = median(u, n);

function a = mean(v, n)          % 子函数
   % 计算均值
   a = sum(v)/n;
function m = median(v, n)        % 子函数
   % 计算中值
   w = sort(v);
   if rem(n, 2) == 1
     m = w((n+1) / 2);
   else
     m = (w(n/2) + w(n/2+1)) / 2;
   end

即使在同一个M文件中,子函数也不能获取用于主函数或其他子函数的参数,除非将它们声明为全局变量,或者作为参数传递。

在从M文件内部调用函数时,MATLAB首先要检查文件,看函数是否为子函数。然后检查该名称的私有函数,最后搜索路径上的独立M文件或内部函数。因为首先会检查子函数,所以可以用相同名称的子函数覆盖已经存在的M文件。

匿名函数

如果使用匿名函数,则可以在不必创建M文件的情况下快速创建简单函数,可以在MATLAB命令行或任何M文件函数或脚本中创建匿名函数。

创建匿名函数的语法格式为:

code.matlab
fhandle=@(arglist) expr

其中,expr表示函数体,即函数要完成主要工作的代码;arglist为要传递给函数的用逗号间隔的输入参数列表。结果返回函数句柄fhandle。

【例3-8】

【例3-8】

本例首先定义一个匿名函数,并用fplot函数绘制该函数的图形。

code.matlab
a = 1.3;   b = .2;   c = 30;
parabola = @(x) a*x.^2 + b*x + c;
fplot(parabola, [-25 25])

结果如图3-2所示。

嵌套函数

可以在一个函数中嵌套定义一个或多个函数。嵌套函数具有类似下面的形式:

code.matlab
function x=A(p1,p2)
…
    function y=B(p3)
    …
    endend

注意:M文件函数一般不需要end语句,但使用嵌套函数时需要end语句。如果M文件包含一个或多个嵌套函数,则必须在M文件中用end语句终止所有函数,不管它们是否包含嵌套函数。

在调用某个嵌套函数时,可以从紧邻它的上一级函数中调用,从同一个父函数中相同级别的函数中调用,或在任何更低级别的函数中调用。例如,在下面的嵌套函数中,函数A可以调用函数B或函数D,但不能调用函数C或函数E;函数B可以调用函数D,函数D可以调用函数B;函数C可以调用函数B或函数D,但不能调用函数E。

code.matlab
function A(x, y)              %主函数
B(x, y);
D(y);
   function B(x, y)           % 嵌套在A函数中
   C(x);
   D(y);
      function C(x)           % 嵌套在B函数中
      D(x);
      end
   end
   function D(x)              % 嵌套在A函数中
   E(x);
      function E              % 嵌套在D函数中
      ...
      end
   end
end

私有函数

私有函数是private子目录中的函数。它们只对父目录中的函数可见。例如,假设目录newmath位于MATLAB的搜索路径上,则newmath目录的private子目录中包含的函数只能被newmath目录中的函数调用。

因为私有函数在父目录外是不可见的,故在其他目录中可以使用与之相同的名称。

重载函数

有时候同一个函数可以用于多种情况,对应地也有不同的输入参数,此时要用到重载函数。比如绘制二维线形图的plot函数就有多种重载形式,下面是其中的两种。

code.matlab
plot(Y)
plot(X1,Y1,...)

这两个函数具有相同的函数名,不同的参数。在调用plot函数时,MATLAB会根据函数的参数自动选择使用。