Matlab程序设计学习课件_第1页
Matlab程序设计学习课件_第2页
Matlab程序设计学习课件_第3页
Matlab程序设计学习课件_第4页
Matlab程序设计学习课件_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

用MATLAB语言编写的可在MATLAB中运行的程序,称为M文件。M文件包含两类:命令文件和函数文件。两者区别在于:(1)命令文件没有输入参数,也不返回输出参数,而函数文件可以输入参数,也可返回输出参数;(2)命令文件对工作空间中的变量进行操作,而函数文件的变量为局部变量,只有其输入、输出变量保留在工作空间中;(3)一般来说,命令文件用于把很多需在命令窗口输入的命令放在一起,而函数文件用于把重复的程序段封装起来,使程序更加简洁。用任何文本编辑器都可编写M文件。在MATLAB的命令窗口中可以运行M文件。无论是函数文件还是命令文件都可被别的程序调用。7.1M文件

由于命令文件没有输入参数和输出参数,只是一些命令行的组合,所以命令文件比函数文件简单。命令文件可对工作空间中的变量进行操作,也可生成新的变量。即使命令文件运行结束,命令文件产生的变量仍将保留在工作空间中,直到关闭MATLAB或用相关命令删除。下面是命令文件例子,在文本编辑器中输入下列命令行,并存为flowerpetal.m。

t=-pi:0.01:pi;

r=2*sin(5*t).^2;

polar(t,r)

在MATLAB的命令窗口中键入flowerpetal,将会画出一系列的花瓣状图形。图7.1花瓣图案

调用该命令文件时,不用输入参数,也没有输出参数,文件自身建立需要的变量。当文件执行完毕后,用命令whos可以查看工作空间中的变量。可见变量t,r仍然保留在工作空间中。

与命令文件相比,函数文件稍微复杂一些。下面为一个只有两行的函数文件例子。

function

c=myfile(a,h)

c=sqrt((a.^2)+(b.^2))

一旦该函数文件建立,在MATLAB的命令窗口或在别的文件里面,就可以用下列命令调用。

>>a=4

>>b=3

>>c=myfile(a,b)

结果为:

C=

5.0000

一个典型的MATLAB的函数文件结构如下:

functionc=soundspeed(s,t,p)%soundspeedcomputesthespeedofsoundinwater%wherecisthespeedofsoundinwaterinm/s

%Usageofthisfunction;%output=soundspeed(input)%RogerJans,1999-12-12.t=0:.1:35;

%形成向量

该函数文件包含以下几部分:

a.函数定义行

文件的第一行为函数定义行,该行定义函数名、输入参数和输出参数的个数。

b.H1行

H1行的字面意思为帮助信息的第一行,在上述文件中为第二行。当用命令lookfor查询该函数的帮助信息时,将显示该行内容。

c.帮助体

文件中两空行之间的部分。当对该函数单独查询帮助信息时,将显示帮助体和HI行的内容。

d.函数体

函数文件中除函数定义行、HI行和帮助体之外的文本,这些命令执行计算、赋值等实质性的工作。

e.注释部分

在函数体中以符号“%”开始直到该行结束的部分表示对程序的注释。如上面文件中倒数第一行的后一部分为注释语句。

在函数定义行functionc=soundspeed(s,t,p)中,function为函数文件的关键字,表明该文件为函数文件:c为输出参数;soundspeed为函数名;s,t,p为输入变量。

MATLAB的所有函数文件都遵从这种定义格式。当函数的输出参数不只一个时,用中括号“[]”把输出参数括起来,参数之间用逗号分开。如果有输入变量时,用小括号括起来,当个数不只一个时,用逗号分开。当函数无输出参数时,输出参数项空缺(等号也省略)或者用空的中括号表示。如:

functionprintrcsults(x)

function[]=printresuits(x)

当调用函数时,输入参数和输出参数可以和定义行的变量名不同,这正如在FORTRAN里函数调用时,形式参数和实际参数可以不同名一样。

MATLAB对函数名的限制如同变量名。函数文件名由函数名再加上后缀“.m”组成,例如函数文件名test.m。当函数文件名和函数定义行的函数名不同时,MATLAB将忽略函数名而确认文件名。所以,当编写函数文件时,文件名可以和函数名不同,但调用时应该使用文件名。不过最好把文件名和函数名统一,以免出错。

函数文件一旦编写好之后,就可在命令窗口或别的文件中调用。调用的格式和函数文件的定义格式相同,只是把定义时的参数名换成相应的变量名。例如:求所有小于2000且为2的整数次幂的正整数。(1)命令文件

f(1)=2;

k=1;

whilef(k)<1000

f(k+1)=f(k)*2;

k=k+l;

end

f,k

保存该文件为t.m。在MATLAB命令窗口中键入文件名t,运行结束后可在屏幕上看到以下内容。

f=

248163264128565121024

k=

10

functionf=tt(n)

f(1)=2;

k=1;

whilef(k)<ceil(n/2)

%ceil函数取最近的正整数

f(k+1)=f(k)*2;

k=k+l;

end

f

保存该文件为tt.m。在MATLAB命令窗口中键入以下命令,便可求所有小于2000的2的正整数次幂。

tt(2000)

f=

2481632641282565121024

当MATLAB遇到一个新的名称时(可能是变量名、函数名、子函数名等),将采用如下的先后顺序来辨别:

a.检查该名称是否为目前上工作空间中的变量。

b.检查该名称是否为子函数名(子函数为函数文件的内部函数)。

c.检查该名称是否为局部函数名(局部函数放在一个单独的目录下,只有其上面一层目录里的M文件可以调用这些函数)。

d.检查该名称是否为MATLAB搜索路径上的函数名。MATLAB将把按照搜索路径的先后顺序搜索到的第—个同名函数当作该名称引用的函数。

在命令窗门或其他的文件中调用函数文件时,MATLAB将把函数编成伪码,并保存在内存中,在MATLAB关闭之前,该函数的伪码一直保存着,以便再次调用该函数时,不用重新编写伪码。当然可以用clear命令清除内存中的函数伪码。命令功

能clear函数名删除内存中指定函数的伪码clearfunctions删除内存中所有函数的伪码clearall删除内存中所有变量和函数的伪码Clear命令的使用

无论是函数还是命令文件的伪码,都可以用pcode命令保存到文件中,以备下次使用时跳过编写伪码这一步,从而提高速度。一般情况下,MATLAB编写伪码的速度相当快,是否使用预先编写的伪码对MATLAB的运行速度影响不大。当有大量的图形界面时,用pcode命令预先编写伪码可以大大提高速度。还有一种情况,当想隐藏程序的源代码时,可以用pcode命令提供伪码。例如:将把文件average.m编成伪码并保存到文件average.p文件中。

pcodeaverage

调用MATLAB的函数时,是通过按值传递方式传递参数。除了一个基本工作空间外,MATLAB还为每个被调用的函数分配一部分内存,称为函数工作空间。每个函数有自己的工作空间。在函数外部只能调用函数的输出参数,其他变量均不可调用。函数的工作空间和基本工作空间是相互独立的,函数内部的变量和基本上作空间中的变量是可以同名的。为了能够调用函数内部变量,可以在函数里把该变量定义为全局变量。

函数nargin和nargout分别用于检查函数被调用时的输入参数和输出参数的个数。有这两个函数,编写程序时可以对不同的调用情况做不同的处理,使函数调用更加灵活。例如,下面程序段中指定,当用一个输入参数调用该函数时,求该参数的平方:当用两个输入参数调用时,求出两个输入参数的和。

function

c=testarg1(a,b)

if(nargin==1)

c=a.^2;

elseif(nargin=2)

c=a+b;

end

函数varargin和varargout允许用户输入任意多的输入参数和输出参数。MATLAB将把所有的输入参数或输出参数组成一个细胞数组。例如,下列函数在图形上把所有输入参数点用直线连接起来。

function

testvar(varargin)

%函数定义行

forI=1:length(varargin)

%对输入参数组成的细胞数组的每一个元素作记号

X(I)=arargin{I}(1);

%取出输入点的横坐标

Y(I)=varargin{l}(2);

%取出输入点的纵坐标

end

xmin=min(O,min(X)):

ymin=min(0,min(Y));

axis([xminfix(max(Y))+3yminfix(max(y))+3])%绘制坐标轴。

plot(x,y)

%绘制图形

调用函数testvar时的参数个数不限,下面的调用语句是合法的。

testvar([23],[15],[48],[65],[42],[903])

上述函数testvar的定义中细胞数组的引用采用varargm{I}(1)的格式,其中用大括h号{}括起来的下标为细胞数组的第几个元素,用小括号()括起来的下标为大括号对应的元素的分量。函数varargout的应用和函数varargin相似,由于调用函数的的输出参数的个数不定,在编程中将用到函数nargout。例如,下列函数将输入的横坐标向量和纵坐标向量的相应元素配对,形成点,输出点坐标。

function[varargou]=change(arrayin)

fori=1:nargout

varargout{I}=arrayin(:,i)

end

当输入三个点的横坐标向量和纵坐标向量组成的矩阵a=[123;678]后,用命令[pl,p2,p3]=change(a)调用change函数,将得到三个点的坐标:p1=(1,6),p2=(2,7),p3=(3,8)。事实上,在函数调用时,细胞数组和普通参数是可以混合使用的,这时应该把varargin和varargout放到参数列表的最后。下面的函数调用行都是合法的。

function[outl,out2]=tt(a,b,varargin)

function[I,j,varargout]=ttt(x1,y1,x2,y2,flag)

7.2局部变量与全局变量

在MATLAB里,全局变量用命令global定义。全局变量可以被所有定义该变量为全局变量的函数使用,如果想在命令行中使用全局变量,也要定义该变量为全局变量。函数中的变量若为局部变量,则只能被本函数调用,在其他函数里和基本的工作空间中都不能调用。和在命令窗口中一样,在M文件中,变量在使用前无需定义其维数和每维的大小。但把一个变量赋给另一个变量时,要求等号右边的变量有值。在MATLAB里,变量名区分大小写。

下面为一个使用全局变量的例子。

functionall=weight_add(x,y)

%addtwovariablewithdifferentweight

globalALPHABETA

all=ALPHA*x+BETA*y;

函数weight_add将输入的参数加权相加,建立文件weight_add.m,在第三行定义全局变量ALPHA和BETA。

在命令窗口中键入:

global

ALPHABETA

ALPHA=1

BETA=2

all=weight_add(1,1);

将在基本工作空间中生成变量a11,其值为3。由于在函数weight_add空间和基本工作空间中都把ALPHA和BETA两个变量定义为全局变量。只要在命令窗口中改变ALPHA和BETA的值,就可改变加权值,而无需修改weight_add.m文件。

上例只在函数weight_add和命令窗口中把ALPHA和BETA变量定义为全局变量,在编程时,可在所有需要调用全局变量的函数里定义全局变量,这样就可实现变量共享。为了在基本工作空间中使用全局变量,也要定义全局变量。

在函数文件里,全局变量的定义语句应放在变量使用以前,为了便于了解所有的全局变量,一般把全局变量的定义语句放在文件的前部。一般来说,全局变量的取名应更能反应变量的具体意思,一般用大写字母表示,以防被误用。

变量名含

义ans当在命令窗口中输入表达式而不赋值给任何变量时,Matlab自动将该值赋给ans。变量ans保存其最近一次被使用的值。epsMatlab计算浮点数的误差限。realmaxMatlab所能表示的最大浮点数。realminMatlab所能表示的最小浮点数。pi3.1415926535897I,j虚数单位。inf无穷大,例如计算n/0(n非0)。NaN非数,例如计算0/0,inf/inf。computer计算机类型和操作系统。flops统计该工作空间浮点数的计算次数。version所用Matlab的版本。

在MATLAB的工作空间中,有几个特殊的变量值。下表列出了这些变量名及其含义。7.3数据类型MATLAB共有六种基本的数据类型,每一种类型都可以是一维、二维和多维的。这六种是:双精度型(double)、字符型(char)、稀疏型(sparse),8位型(uint8)、细胞型(cell)和结构型(struct)。一般把这六种类型的二维变量称为矩阵,其中最常用的是双精度矩阵和字符型数组。

MATLAB的计算都采用双精度,MATLAB提供的绝大部分函数都是对双精度矩阵和字符串操作的,其他几种数据类型用于特殊的场合。比如8位型用于图像处理,稀疏型用于稀疏矩阵,细胞型和结构型一般用于编写大型软件。

数组在最上一层,表明MATLAB的所有数据类型都是向量。从大类上数组可分为字符型、细胞型、结构型和数值型;数值型又可分为双精度型和8位型;稀疏型是双精度型的一种,因为稀疏矩阵的每一个元素都是以双精度存储和运算的。图7.2数据类型图

六种数据类型的关系可用图7.2表示。数据类型(class)举例

解释

double

[12;34]5+6i双精度数值类型,是最常用的类型。char‘hello’字符数组,每个字符占16位。

sparsesparse(5)双精度稀疏矩阵,只存储矩阵中的非0元素。cell{17'hello'eye(2)]}细胞数组,数组中的每个元素可为不同类型、不同维数。struct

a.day=12;a.color='red'a.mat=magic(5);结构数组相当于数据库的记录,把相关的数据列在在一起,为属性,不同属性的数据类型可以不同。unit8unit8(magic(3))8位型,为无符号整数,最大可表示255,不能进行数学运算。表7.3数据类型举例

变量的数据类型可用函数isa来查看,其调用格式为:

isa(变量名,数据类型)

当矩阵s为稀疏矩阵时,下面三条命令都将返回1。

isa(s,'sparse')

isa(s,'double')

isa(s,'numeric')

所有MATLAB的六种数据类型都支持一定的函数和运算(方法),子一层的数据类型支持其父一层的所有运算,例如双精度型数据支持所有数组一层的计算。数据类型方法

数组

多维下标、组合(如'[ab]')、转置、行列初等变换、数组变形(reshape)、求维数、各维的大小(size,length,ndims细胞型各元素用{}引用。字符型字符函数(sutrcmp,lower),计算时自动转换成双精度型。

数值型find函数、复数元素、冒号算符(1:10)。

双精度型数学算符(+,-,*,/等)、逻辑算符(><&|等)、矩阵函数(eig、std等)、数学函数(sin、cos、sum、prod、sort等)。稀疏型稀疏函数和算符(/,.*,splu,spchol等)。结构型属性引用。

8位型存储特性(详见ImageProcessing工具箱)。表7.4数据类型及支持的方法

与其他应用软件不同之处在于,MATLAB不能用double、char来定义变量。之所以把数据类型分为六种,只是为了把具有相同性质的数组归纳分类。

8位型数据不能做任何计算,在计算之前,必须用函数double转换为双精度数据。在MATLAB里,可以创建自定义数据类型,也可以为已有的数据类型增加新的使用方法。自己定义的数据类型可以和MATLAB已有的数据类型一样使用。

7.4运算符MATLAB的运算符可分为三类:算术运算符、关系运算符和逻辑运算符。其中算术运算符的优先级最高,其次是关系运算符,再其次是逻辑运算符。下面将分别介绍这三类运算符和逻辑函数。

一、算术运算符

按照运算符的优先级可把算术运算符分为五级,在每一级里的运算符有同样的优先级,在运算时自左向右结合。各级包含的运算符为:

①优先级最高的是转置符(.')、幂符(.^)、复共轭转置(')、矩阵幂符('):

②标量加(+)、标量减(-);

③向量乘法(.*)、向量右除(./)、向量左除(.\)、矩阵乘法(*)、矩阵右除(/)、矩阵左除(\);

④加法(+)、减法(-);

⑤冒号运算符(:)。

MATLAB默认的运算优先等级可用括号强制改变。例如下面两个算式的计算先后顺序不一。

C=A./B.^2

C=(A./B).^2

大部分的算术运算符只对相同维数的数组的对应运算作运算。对于矩阵和向量,算术运算符连接的两个运算数必须同维或者两个中有一个是标量。当一个运算数是标量时,运算符将把标量和另一个运算数的每一个运算数进行运算。

二、关系运算符关系运算符对于程序的流程控制非常有用,在MATLAB的循环和条件控制中经常使用。MATLAB里共有六个关系运算符,它们是:

<

小于

<=

小于等于

>

大于

>=

大于等于

==

等于

~=

不等于

所有关系运算符连接的两个运算数必须是同维、每维同大小的。对于长方形矩阵和向量,两个运算数或者同维、同大小,或者其中—个为标量。当有—个运算数是标量时,关系运算符把标量和另一个运算数的每个运算进行比较。关系运算符将生成一个0-1矩阵,当运算数相应元素对于关系运算符为真时,对应位置上生成1,否则为0。切记,MATLAB的所有关系运算符都是对运算数中对应的元素逐个计算。例如:

A=[276;90-10;30.56];

B=[80.20;325;407]:

A<B

ans=

100

011

l01

当一个矩阵A和空矩阵用关系运算符比较时,MATLAB将给出错误信息。要检验一个矩阵是否为空矩阵,应使用函数isempty。例如,当矩阵A为空矩阵时,命令isempty(A)将得到1。

A=[123;456];B=[];

isempty(A)ans=0isempty(B)ans=1

四、逻辑函数除了与(&)、或(|)、非(~)这三个逻辑运算符以外,MATLAB还提供了一些逻辑运算函数。主要有异或函数(xor)、all函数、any函数、isnan函数、isinf函数和isfinite

函数。异或函数xor对两个运算数作异或运算。当两个运算数中对应元素逻辑上的真假值相反时,表达式的值为真,其他情况(两个都真或两个都假)为假。异或函数xor返回值为0-1矩阵。当逻辑表达式的值为真时,返回元素1,否则返回0。例如,变量a和b都为1时,命令xor(a,b)将得到ans=0。

当向量的元素都为真时,all函数将返回变量1,否则返回变量0。对于矩阵,函数all对列操作。当某列的元素都为真时,返回值1。函数all对于矩阵的最终运算结果为一个行向量。例如,

u=[12340;32451];

All(u)ans=11110

当向量中至少有一个元素为真时,函数any将返回变量1;只有当向量中的所有元素全为假才返回变量0。和函数all一样,当运算数为矩阵时,函数any将逐列运算,最后返回结果为一个0-1行向量。

函数isnan、isinf和isfinite返回和运算数同维的数组。当运算数的元素为NaN时,函数isnan在返回数组的相应位置返回1,否则返回0。当运算数的元素为inf时,函数isinf在返回数组的相应位置返回l,否则返回0。当运算数的元素不为inf和NaN时,函数isfinite在相应的位置返回1,否则返回0。下面为一个使用函数isnan、isinf和isfinite的例子。在程序段第三行中的运算符“/”表示对矩阵的对应元素相除。

A=[015;2NaNinf];B=[001;525inf];C=A./B

Warning:Dividebyzero.

C=NaNInf5.00000.4000NaNNaN

isfinite(C)

ans=001100

isnan(C)

ans=100011

isinf(C)ans=010000

当NaN和别的数计算时,所得结果均为NaN,事实上,所有含NaN的表达式的值均为NaN,一般称这为NaN的传播性。表达式inf/inf、0/0的值为NaN。表达式1/inf的值为0。

函数find用于于查找向量中的真元素的下标。对于数值向量,真元素即为非0元素。在find的常用调用格式中,将返回向量中满足要求的下标组成的列向量。下面的程序段给出它的用法。

A=magic(3)%生成三阶魔方矩阵。

A=

816

357

492

i=findt(A>5)%查找命令A>5生成的0-1矩阵中的非0元素,并将非元素在矩阵中的一维下标生成列向量i。

i=

1

6

7

8

A(i)=1000%将魔方矩阵中下标为i的元素赋值为1000。

A=

100011000

3

51000

41000

2

五、位运算符

matlab提供了丰富的位运算功能。位运算符见表7.4。

位运算符说明bitand位对位的ANDbitcmp每个位的NOTbitor每个位的ORbitxor位对位的XORbitset设定某位bitget取得某位bitshift移位

例如,数字10的二进制值是1010,4的二进制是0100,因此数字10和4的bitor应为14,可验证如下:

>>bitor(22,4)

ans=

14

又例如,将18的二进制表示法向左移一位,其效果相当于乘2,可验证如下:

>>bitshift(10,1)

>>ans=

36

六、集合运算符

matlab提供了丰富的集合运算功能。位运算符见表7.5。

集合预算符说明union并集intersect交集setdiff差集setxor集合的XORunique返回最小等效集合(每个元素只出现一次)ismember测试元素是否属于某集合例如:

>>x=[123456];

>>y=[1155999];

union_result=union(x,y)

union_result=

1

2

3

4

5

6

9

>>intersect_result=intersect(x,y)

intersect_result=

1

5

>>setdiff_result=setdiff(x,y)

setdiff_result=

2

3

4

6

>>setxor_result=setor(x,y)

setor_result=

2

3

4

6

9

7.5程序流程控制

程序流程控制MATLAB提供重复循环(Loop)及条件判断(Condition)等程序流程控制(FlowControl)的语句,最简单的程序重复执行语句是for循环(For-loop),其基本使用语法为:

for变量=向量

表达式;

end

其中变量的值会被依次设定为向量的每一个元素值,来重复执行介于for和end之间的表达式。因此,若无意外情况,表达式执行的次数会等于矩阵的列数。

>>x=zeros(1,6);

%预先分配矩阵x为一个维数1*6的零矩阵

>>fori=1:6

>>

x(i)=1/i;

>>end

>>disp(x)

%显示矩阵x的内容

1.0000

0.5000

O.3333

0.2500

0.2000

0.1667

在上例中,矩阵x最初是一个1*6大小的零矩阵,在for循环中,变量i的值依次是1到6(即矩阵[123456]中的每一列向量内容),因此矩阵x的第i个元素的值依次被设为1/i。>>x=[2451169];>>forn=x>>y(n)=n/10;>>end>>y>>y=00.200000.40000.50000.6000000.900001.1000

循环次数决定于x数组的列数,for循环一次,n就取x中的一列值作为其值,一次执行结束之后,n就取x下一列的值,直到x的最后一列。Y则取x向量中最大值作为数组元素的个数,即y(1)至y(11)。

另一个常用到的程序重复执行语句是while循环(While—loop),其基本使用语法为:

while条件式

表达式;

end

也就是说,只要条件式成立,表达式就会一再被重复执行。例如,先前用for循环产生的调和序列的做法,可用while循环改写如下:

>>x=zeros(1,6);

%x是—个l*6的零矩阵

>>i=1;

>>whilei<=6

>>x(i)=1/i;

>>i=i+l;

>>end

>>disp(x)

1.0000

0.5000

0.3333

0.2500

0.2000

0.1667

提示:预先分配矩阵

上面的几个例子中,使用zeros来预先分配(Pre-allocate)了一个适当大小的矩阵。若不预先分配矩阵,程序仍可执行,但此时MATLAB需要动态地增加(或减小)矩阵的大小,因而降低了程序的执行效率。所以在使用一个矩阵时,着能在事前知道其大小,则最好先使用zeros或ones等命令来预先分配矩阵所需的内存大小,以提高程序的执行效率。

MATIAB也提供根据条件判断来控制程序流程的语句,最常见为if-else-end的语句组合,其基本语法为:

if

条件式

表达式;

else

表达式;

end

>>ifrand(1,1)>0.5

>>disp('GivenrandomnumberisgreaterthanO.5.');

>>else

>>disp('GivenrandomnumberiSlessthan0.5.');

>>end

Givenrandomnumberislessthan0.5.

有关程序流程控制,在后面会有更详尽的介绍。

switch语句,其语法格式为:

switch表达式(%可以是标量或字符串)

case值1

语句1case值2

语句2

….otherwise

语句nend

表达式的值和哪种情况(case)的值相同,就执行哪种情况中的语句,如果不同,则执行otherwise中的语句。格式中也可以不包括otherwise,如果表达式的值与列出的各种情况都不相同,则继续向下执行。

break是Matlab中的强制跳转命令,通常用在for和while循环中,当执行这个命令之后,Matlab就跳出for和while循环,转到循环之外的下一条语句。>>EPS=1;>>fornum=1:1000EPS=EPS/2;

if(1+EPS)<=1EPS=EPS*2

break

endendEPS=2.2204e-016

提示:break命令仅迫使程序跳出一个循环。

continue也是一个强制跳转命令,当Matalb遇到该命令时,就立即跳到for或while循环的end处,结束一次循环。例如:>>EPS=1;>>fornum=1:1000EPS=EPS/2;

if(1+EPS)>1

continue

endEPS=EPS*2

break

endEPS=2.2204e-016

提示:在这continue命令对if-end结构没有任何影响。Try-catch模块使得用户能捕获程序执行过程中的的错误,以便决定如何对错误进行响应。格式如下:

try

语句1…catch

语句2end

在执行语句1过程中,如果没有错误发生,程序控制就直接跳到end语句,如果出现错误就立即转移到catch语句,执行语句2,在语句2中,通常会利用lasterr和lasterror函数获取错误信息,然后采取相应的措施。例如:x=ones(4,2);y=4*eye(3)tryz=x*y;catchz=nan;disp(‘xandyarenotconfortmable.’)endzxandyarenotconfortmable.z=NaN7.6子函数

每一个函数文什可以包含多个函数。在函数文件的第一行定义的函数为主函数,当调用文件名时,调用主函数。在函数文件中,除了第一行定义的函数外,其余的函数称为子函数。子函数只能被该文件里的其他函数和主函数调用。

在函数文件里,子函数的定义和主函数相同。子函数的顺序序是任意的。如果函数中包含return语句,则函数执行到该语句终止,否则执行到最后一行终止,使执行权返回调用函数。例如:function

d=det(A)%DETdet(A)isthedeterminantofA.ifisempty(A)d=1;returnelse...end如果输入矩阵为[]时,d=1,函数返回到调用处。function

out=main_func(x)%主函数

recip=reciproc(x);%调用子函数

out=sum(recip);function

output=reciproc(input)%子函数

output=1./input;此函数可调用如下:>>main_func([123])ans=1.8333

当在一个函数文件中调用函数时,MATLAB首先检查该函数是否为该文件的子函数。然后将检查是否为局部函数,然后再检查该函数是否为搜索路径上的M文件名。由于最先搜索的是子函数名,所以子函数的名字可以和其他的M文件名相同。放在子目录private下的函数称为局部函数。只有private子目录的父目录里的函数才能调用这些局部函数。例如在目录A下建立子目录private,子目录private中的函数只能被目录A中的函数调用。所有private中的函数都称为局部函数。由于private中的函数在A目录以外不能被调用,所有private中的函数和A目录以外的函数可以同名,而不会互相干扰。7.7错误与警告信息

在很多情况下,需要对程序中对不同的错误情况采取相应的措施。例如,当运行程序时输入参数不对,希望程序能够提示用户;程序出错时希望显示错误信息;当缺少某个参数时希望能采用默认值计算等等。MATLAB提供了有效的错误处理功能。

一、eval函数和lasterr函数函数eval和Iasterr是MATLAB处理错误的基本工具。当一个函数运行出错时,函数eval允许运行另外一个函数。函数lasterr将给出一个包含最后一次错误信息的字符串。

函数eval的处理错误的功能是通过双参数调用来实现的。其调用格式为:

eval('字符串1','字符串2')

当字符串1提供的运算能正常实现时,忽略字符串2;当字符串1运行出错时,则运行字符串2。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论