您的当前位置:首页正文

matlab课件之二第04章

2021-09-21 来源:好走旅游网
第四章 MATLAB程序设计

MATLAB作为一种广泛应用的科学计算软件,它不仅有强大的数值计算、符号计算、绘图动能,而且它还可像C、FORTRAN等计算机高级语言一样,进行程序设计,编写一种以m为文件扩展名的文件,即所谓的m文件。事实上,MATLAB的许多函数就是m文件函数。MATLAB作为一个集成化的软件包,它提供了m文件编辑器与编译器。

4.1 m文件简介

所谓m文件,简单地说,就是用户把要实现的命令写在一个以m文件作为文件扩展名的文件中,然后由MATLAB系统进行解释,运行出结果。也就是说,m文件实际上就是一个命令集。m文件的通用性,就使得MATLAB有了很好的可开发性和可扩展性。一方面,MATLAB中的许多函数本身就是m文件, 这样,用户完全可以用m文件来生成和扩充自己的函数库。另一方面,由于MATLAB是用C语言开发而成的,因此,m文件的语法规则与C几乎完全一样,这对于C语言用户来说,就显得更容易了。

4.1.1 m文件建立与编辑

1. m文件的建立

为了建立一个新的m文件,启动MATLAB文本编辑器有如下3种方法。

(1) 菜单操作。从MATLAB命令窗口的File菜单中选择New菜单项,再选择M-file。屏幕将出现Editor/Debugger窗口。Editor/Debugge是一个集编辑与调试两种功能于一体的工具环境。利用它不仅可以完成基本的文本编辑操作,还可以对m文件时行调试。MATLAB文本编辑器的操作界面与使用方法与其他Windows编辑器相似,这里不再作详细介绍。

启动MATLAB文本编辑器后,在文档窗口我们就可以使用键盘输入m文件的内容,输入完毕后,选择文本编辑器窗口File菜单的Save As命令存盘。注意,m文件存放的位置一般是MATLAB缺省的用户…\\work中,当然,也可以通过存在用户指定的目录中,也可以将要工作的目录设定为当前目录或将其加到搜索路径中。

(2) 命令操作。在MATLAB命令窗口输入命令edit,也可启动的Editor/Debugger窗口。

(3) 命令按扭操作。单击MATLAB命令窗口工具栏上的新建命令按扭,也可启动的Editor/Debugger窗口。可以在edit后前加上文件名,也可是带路径的文件。

2. 已有m文件的编辑

1

编辑已有为了建立一个新的m文件,启动MATLAB文本编辑器有如下3种方法。

(1) 菜单操作。从MATLAB命令窗口的File菜单中选择Open菜单项,则屏幕将出现Open对话框,在Open对话框中选中所需打开的m文件。然后对文件进行编辑、修改,完成后存盘。

(2) 命令操作。在MATLAB命令窗口输入命令edit 文件名(也可带路径),则打开指定的m文件。

(3) 命令按扭操作。单击MATLAB命令窗口工具栏上的打开命令按扭,再从弹出的对话框中选择所需打开的m文件。

4.1.2 m文件的分类

m文件有两类:命令文件(Script File)和函数文件(Function File)。它们的扩展名都为.m,主要区别在于MATLAB提供的数据类型有: 复数双精度矩阵、数值矩阵、字符串、稀疏矩阵、单元数组、结构、对象

(1) 命令文件没有输入参数,也不返回输出参数,而函数文件可以带输入参,也可返回输出参数。 (2) 命令文件对MATLAB工作空间中的变量进行操作,文件中所有命令的执行结果也完全返回到工作空间中,而函数文件中定义的变量为局部变量,当函数文件执行完毕时,这些变量被清除。

(3) 命令文件可以直接运行,在MATLAB命令窗口输入命令文件的名字,就会顺序执行命令文件的命令,而函数文件不能直接运行,而要以函数调用的方式来调用它。

例4.1.1 建立一个命令文件,将变量a, b的值互换,然后运行该命令文件。 首先建命令文件并以文件名ex411.m存盘。 clc

clear a=1:10; b=[11,12,13,14 15,16,17,18]; c=a; a=b; b=c; a b

然后在运行程序,即在命令窗口中输入ex411,将会运行该程序, ex411

a =

2

11 12 13 14 15 16 17 18 b =

1 2 3 4 5 6 7 8 9 10

注意:加上存放程序文件的搜索路径。在命令窗口执行程序时,输入文件名,不用带扩展名.m。 当文件执行完毕后,可以用命令whos查看工作空间中的变量,这里会发现a, b, c仍然保留在工作空间中。

例4.1.2 建立一个函数文件,将变量a, b的值互换,然后在命令窗口调用该函数文件。 首先建函数文件并以文件名ex412f.m存盘。 function [a,b]=ex412f(a,b)

c=a; a=b; b=c;

然后在命令窗口调用该函数文件:

clear x=1:10; y=[11,12,13,14 15,16,17,18]; [x,y]=ex412f(x,y) 输出结果为:

x =

11 12 13 14 15 16 17 18 y =

1 2 3 4 5 6 7 8 9 10

调用该函数文件时,既有输入参数,又有输出参数。当函数调用完毕后,可以用命令whos查看工作空间中的变量,这里会发现a, b, c未被保留在工作空间中。

3

4.2 MATLAB中表达式和语句

从上面的m文件中,我们可以看到,m文件是由表达式和语句组成的。

4.2.1 表达式

任何运算MATLAB的语法规则作用于任何操作对象(常量、变量或函数)便构成MATLAB的表达式。MATLAB程序中有算术表达式、关系表达式、逻辑表达式、函数表达式等。算述表达式用于数值计算。关系表达式的值只有1与0之分,分别表示逻辑值的真与假。逻辑表达式其操作对象只有非0与0之分,分别表示逻辑值的真与假,并以1和0分别表示逻辑值的真与假。函数表达式,用于函数操作。

4.2.2 表达式语句

单个表过式就是表达式就是表达式语句,如: 2*x+3/y -8.92 cos(x)

是3个表达式语句。一行可以只有一个语句,此时语句以分号“;”、逗号“,”、回车换行而结束。以分号结束的执行后不显示运行结果。以逗号或回车换行的语句执行后显示运行结果,即表达式的值。表达式语句运行后,其值暂时保留在固定变量ans中。ans变量只保留最近的一次结果。如 2+3 ans= 5 sqrt(ans) ans =

2.2361

MATLAB语言中一个语句可以占多行,由多行构成一个语言时,用“…”作续行符。如:

x=pi/5; sin(2*x)+... cos(x/2) ans =

1.9021

4

4.2.3 赋值语句

将单个表过式的值赋给变量就构成赋值语句。如: x=10 x= 10

4.3 数据的输入与输出

MATLAB中数据的输入与输出方式包括从命令窗口的输入与输出和通常文件操作的输入与输出。另外,还是现代软件流行的图形界面的输入与输出方式。

MATLAB提供了输入与输出函数,使我们可方便时和计算机进行数据交换。

4.3.1 输入函数

如果我们想从键盘输入数据,可以使用input函数,其调用格式为:

A=input(„提示信息‟,选项)

其中,提示信息为一字符串,用单引号标识,用于提示用户输入什么样的数据。如: A=input(„输入A矩阵:‟);

执行该语句时,首先在屏幕上显示提示信息“输入A矩阵”,然后等待用户从键盘按MATLAB规定的格式输入A矩阵的值。

如果使用选项,如:

xh=input('What ''s your name?','s') What 's your name? Yu Xiangyang xh =

Yu Xiangyang

4.3.2 输出函数

disp函数是MATLAB提供的命令窗口的输出函数,其调用格式为:

disp(输出项)

其中,输出项可以是字符串,也可以是矩阵。如:

5

A='Hello';

disp(A)

则在屏幕上输出为:

Hello

又如:

A=[1,2,3;4,5,6;7,8,9]; disp(A)

输出为:

1 2 3 4 5 6 7 8 9

注意,用disp函数显示矩阵时将不显示矩阵的名字,而且其格式更紧密,不留任何没有意义的空行。

4.3.3 暂停函数

当程序运行时,为了查看程序的中间结果或者观看输出的图形,有时需要暂停程序的执行,这时可以用pause函数是MATLAB提供的命令窗口的输出函数,其调用格式为: pause(延迟秒数)

如果省略延迟时间,直接使用pause,则将暂停程序,直到用户按作一键后程序继续执行。 若要强行中止程序的运行,可使用组合键:Ctrl+C。

4.4 选择结构

选择结构是根据给定条件成立或不成立,分别执行不同的语句。MATLAB用于选择结构的语句有if语句、switch语句和try语句。

4.4.1 条件语句

在MATLAB中,条件语句有3种格式。 1. 单分支条件语句 单分支条件语句格式为: if 条件表达式

6

语句段 end

当条件成立时,就执行语句段,执行完之后继续执行if语句的后继语句,若条件不成立,则直接执行if语句的后继语句。

2. 双分支条件语句 双分支条件语句格式为: if 条件表达式 语句段1 else 语句段 2 end

当条件成立时,就执行语句段1,否则执行语句段2,语句段1或语句组2执行完后,再执行if语句的后继语句。

3. 多分支条件语句 多分支条件语句格式为: if 条件表达式 1 语句段1 elseif 条件表达式 2 语句段 2 …

elseif 条件表达式 m 语句段 m else

语句段 m+1 end

多分支条件语句也要可看成是条件的嵌套。

4.4.2 switch语句

switch语句根据表达式的取值不同,分别执行不同的语句,其语句格式为: switch 表达式

7

case 表达式 1 语句段 1 case 表达式 2 语句段 2

case 表达式 m 语句段 m

otherwise

语句段 m+1 end

switch语句的执行过程如下:当表达式的值行于表达式1的值时,执行语句段1,当表达式的值等于 表达式2的值时,执行语句段2,…,当表达式的值等于表达式m时,执行语句段m,当表达式的值不等case所列的表达式的值时,执行语句段m+1。当任一分支的结构执行完后,便执行switch语句的下一句。 Switch子句后面的表达式应为一个标量或一个字符串,case子句后面的表达式不仅可以为一个标量或一个字符串,而且还可以为一个单元矩阵。如果case子句后面的表达式为一个单元矩阵,则表达式的值等于该单元矩阵中的某个元素时,执行相应的语句组。

4.5 循环结构

循环结构是指按照给定条件,重复执行指定的语句,这是十分重要的一种程序结构。MATLAB提供了两种实现循环结构的语句:for语句和while语句。

4.5.1 for循环语句

for循环语句格式为:

for 循环变量=表达式1:表达式2:表达式3 循环体语句段

end

其中表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环体变量的终值。步长为1时,表达式2可以省略。

for语句的执行过程如下:首先计算3个表达式的值,再将表达式1的值赋给循环变量,如果此时循

8

环变量的值介于表达式1和和表达式3的值之间,则执行循环体语句,否则结束循环的执行。执行完一次循环之后,循环变量自增一个表达式2的值,然后再判断循环变量的值是否介于表达式1和表达式3之间,如果满足,仍然执行循环体,直至不满足为止。这时将结束for语句的执行,百继续执行for语句后面的语句。

for语句的循环变量与其他高级语言的相关循环语句(如FORTRAN中的DO语句,C语言中的for语句)一样,是标量。但在MATLAB中,for语句的循环变量还可以是一个列向量。这样在MATLAB中,for更一般的格式为:

for 循环变量=矩阵表达式 循环体语句段

end

执行过程是依次将矩阵的各列元素赋给循环变量,然后执行循环语句,直至各列元素处理完毕。实际上,“表达式1:表达式2:表达式3”是一个仅为一行的矩阵(行向量),因而列向量是单个数据。所以,前面一开始的for语句格式是上面这种格式的一种特例。

4.5.2 while语句

while语句的一般格式为:。

while (条件) 循环体语句段

end

其执行过程为:若条件成立,则执行循环语句,执行后再判断条件是否成立,如果不成立则跳出循环。 与循环结构有关的还有一个break语句,当在循环体内执行到该语句时,程序跳出循环。该语句一般与if语句配合使用。

如在程序中,循环的条件为1,即循环条件总是满足时,这是一个永真循环。这时,为了使循环能正常结束,在循环中可以加一个if语句,配上break语句,就可以使程序从循环中跳出来。

4.5.3 循环语句的嵌套

如果一个循环结构又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。实现多重循环结构仍用前面介始的3种循环语句。因为任一循环语句的循环部分都可以包含另一个循环语句,这种循环的嵌套为实现多重循环提供了方便。

多重循环的嵌套层数可以是任意的。可以按照嵌套层数,分别叫做二重循环、三重循环等。处于内部

9

的循环叫作内循环,处于外部的循环叫作外循环。

在设计多重循环时,要特别注意内、外循环之间的关系,以及各语句放置的位置,不要搞错。

4.6 函数文件

函数文件是另一种形式的m文件,每一个函数文件都定义一个函数。事实上,MATLAB提供的标准函数大部分都是由函数文件定义的。

4.6.1 函数文件的基本结构

函数文件由function语句引导,其基本结构为: function 输出形参表=函数名(输入形参表) 注释说明部分

函数体语句段

其中,function开头的一行为引导行,表示该m文件是一个函数文件。函数名的命名规则与变量名相同。输入形参为函数的输入参数,输出形参为函数的输出参数。当输出形参多于一个时,则应该用方括号括起来。关于函数以及函数文件有几点说明如下:

(1) 关于函数文件名。函数文件名通常由函数名再加上扩展名.m组成,不过函数文件名与函数名也可以不相同。当两者不同时,MATALB将忽略函数名而确认函数文件名,因此调用时使用函数文件名。所以,最好把文件和函数名取的一样,以免出错。

(2) 关于注释说明部分。注释说明一般包括三部内容:

第一、紧随函数名文件引导之后以%开头的第一注释行。这一行一般包括大写的函数文件名和函数功能简要描述,供lookfor关键词查询和help在线帮助用。

第二、第一注释行及之后的连续注释行。通常包括函数输入输出参数的含义及调用格式说明等信息,构成全部在线帮助文本。

第三、与在线帮助文本相隔一空行的注释行。包括函数文件编写和修改的信息,如作者、修改日期、版本等内容,用于软件档案管理。

(3) 关于return语句。如果在函数文件中插入了return语句,则执行到该语句就结束函数的执行,程序流程转至调用该函数的位置。通常,在函数文件中也可不使用return语句,这时在被调函数执行完成后自动返回。

10

4.6.2 函数的调用

函数文件编制好后,就可调用函数进行计算了。函数调用的一般格式是: [输出实参表]=函数名(输入实参表)

要注意的是,函数调用时各实参出现的顺序、个数,应与函数定义形参的顺序、个数一致,否则将会出错。函数调用时,先将实参传递给相应的形参,从而实现参数传递,然后再执行函数的功能。

4.6.3 函数所传递参数的可调性

MATLAB在函数调用上有一个与一般高级语言不同之处,就是函数所传递参数数目的可调性。凭借这一点,一个函数可完成多种功能。

在调用函数时,MATLAB用两个永久变量nargin和nargout分别记录调用该函数时的输入实参和输出实参的个数。只要在函数文件中包含这两个变量,就可以准确地知道该函数文件被调用时的输入输出参数个数,从而决定函数如何进行处理。

4.6.4 全局变量和局部变量

在MATLAB中,全局变量用命令global定义。

函数文件的内部变量是局部的,与其他函数文件及MATLAB工作空间相互隔离。但是,如果在若干函数中,都把某一变量定义为全局变量,那么这些函数将公用一个变量。全局变量的作用域是整个MATLAB工作空间,即全程有效。所有的函数都可以对它进行存取和修改。因此,全局变量是函数间传递信息的一种手段。

值的指出的是,在程序设计中,全局变量固然要以带来某些方便,但却破坏了函数对变量的封装,降低了程序的可读性。因而,在结构化程序设计中,全局变量是不受欢迎的。尤其当程序较大,函数较多时,全局变量将全程序调试和维护带来不便,故不提倡使用全局变量。如果一定用全局变量,最好给它一个能反映变量含义的名字,以免和其他变量混淆。

在实际编程中,可在所有需用调用全局变量的函数里定义全局变量,这样就可以实现数据共享。另外,为了在基本工作空间使用全局变量,也要定义全局变量。

在函数文件里,全局变量的定义语句应放在变量使用以前,为了使用了解所用的全局变量,一般把全局变量的定义语句放在文件的前面。

4.7 文件操作

11

文件操作是一种重要的输入与输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入与输出函数,以用于文件操作。

4.7.1 文件的打开与关闭

1. 打开文件

在读写文件之前,必须先用fopen函数打开文件,并指定允许对该文件进行的操作。fopen函数的调用格式为:

fid=fopen(文件名,打开方式)

其中fid用存储文件句柄值,如果句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式有:r (读)、w (写)、a (追加)、r+ (可读可写)等。例如,要对数据文件ex471.dat进行读操作,打开该文件: fid=fopen(„ex471.dat‟, „r‟)

2. 关闭文件

文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为, sta=fclose(fid)

该函数关闭fid所表示的文件。Sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(„all‟)。

4.7.2 二进制文件读写操作

1. 读二进制文件

用fread函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为: [A, COUNT]=fread(fid. size, precision)

其中A用于存放读取的数据,COUNT返回所读取的数据元素个数,fid为文件句柄,size为可选项,若不选用则读取整个文件内容,若选用,则它的值可以是下列值:N (读取N个元素到一个列向量)、inf (读取整个文件)、[M, N] (读数据到M×N的矩阵中,数据按列存放)。precision 代表数据类型(精度),常用的有:char, uchar, int, long, float, doubl等。例如, fid=fopen(„ex472.dat‟, „r‟); A=fread(fid, 100, „long‟); sta=fclose(fid);

以读方式打开数据文件ex382.dat,然后按长整型数据格式读取该文件前100个数据放入向量A,最后

12

关闭文件。

2. 关闭文件

fclose函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为, COUNT=fwrite(fid, A, precision)

其中COUNT返回所写的数据元素个数,fid为文件句柄,A用来存放写入文件的数据,precsion用于控制所写数据的精度,其形式与fread相同,如, fid=fopen(„ex473.bin‟, „w‟); fwrite=(fid, B, „float‟);

将矩阵B中的数据用浮点格式写入ex473.bin二进制文件中。

4.7.3 文本文件的读写操作

1. 读文本文件

用fscanf函数可以读取文本文件的内容,并按指定格式存入矩阵。其调用格式为: [A, COUNT]=fscanf(fid, format, size)

其中A用以存放读取的数据,COUNT返回所读取的数据元素个数。Fid为文件句柄。Format用于控制读取的数据格式,由%与格式符组成,常见的格式符有:d (整型)、f (浮点型)、s (字符串型)、c (字符型)等,在%与格式符之间还可以插入附加格式说明符,如数据宽度说明等。size为可选项,决定矩阵A中数据的排列形式,它可以取下列值:N (读取N个元素到一个列向量)、inf (读取整个文件)、[M,N] (读数据到M×N的矩阵中,数据按列存放)。例如,从指定文件中读取200个整数,并存入向量a中: a=fscanf(fid, „%5d‟, 200)

也可以将读取的200个整数存入10×20的矩阵b中, b=fscanf(fid, „%5d‟, [10, 20]);

2. 写文本文件

fprintf函数用于将数据按指定的格式写入到文本文件中,其调用格式为: COUNT=fprintf(fid, format, A)

其中A存放要写入文件的数据。先按format指定格式将数据矩阵A格式化,然后写入到fid所指定的文件。格式符与fscanf函数相同。例如,

13

4.7.4 数据文件的定位

MATLAB提供了与文件定位操作有关的函数fseek和ftell。通过这两个函数,用户可以设定或获文件指针位置,以方便、灵活地进行输入与输出操作。

14

因篇幅问题不能全部显示,请点此查看更多更全内容