第3章M文件设计讲稿.docx

上传人:b****3 文档编号:11583756 上传时间:2023-06-01 格式:DOCX 页数:43 大小:98.62KB
下载 相关 举报
第3章M文件设计讲稿.docx_第1页
第1页 / 共43页
第3章M文件设计讲稿.docx_第2页
第2页 / 共43页
第3章M文件设计讲稿.docx_第3页
第3页 / 共43页
第3章M文件设计讲稿.docx_第4页
第4页 / 共43页
第3章M文件设计讲稿.docx_第5页
第5页 / 共43页
第3章M文件设计讲稿.docx_第6页
第6页 / 共43页
第3章M文件设计讲稿.docx_第7页
第7页 / 共43页
第3章M文件设计讲稿.docx_第8页
第8页 / 共43页
第3章M文件设计讲稿.docx_第9页
第9页 / 共43页
第3章M文件设计讲稿.docx_第10页
第10页 / 共43页
第3章M文件设计讲稿.docx_第11页
第11页 / 共43页
第3章M文件设计讲稿.docx_第12页
第12页 / 共43页
第3章M文件设计讲稿.docx_第13页
第13页 / 共43页
第3章M文件设计讲稿.docx_第14页
第14页 / 共43页
第3章M文件设计讲稿.docx_第15页
第15页 / 共43页
第3章M文件设计讲稿.docx_第16页
第16页 / 共43页
第3章M文件设计讲稿.docx_第17页
第17页 / 共43页
第3章M文件设计讲稿.docx_第18页
第18页 / 共43页
第3章M文件设计讲稿.docx_第19页
第19页 / 共43页
第3章M文件设计讲稿.docx_第20页
第20页 / 共43页
亲,该文档总共43页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

第3章M文件设计讲稿.docx

《第3章M文件设计讲稿.docx》由会员分享,可在线阅读,更多相关《第3章M文件设计讲稿.docx(43页珍藏版)》请在冰点文库上搜索。

第3章M文件设计讲稿.docx

第3章M文件设计讲稿

第3章 M文件设计

前面两章进行各种操作时,都是在MATLAB命令窗口中输入命令行实现的。

这种使用方式比较简便。

但是,当命令行比较多,或者需要重复调用这些命令行时,就需要采用M文件函数的运行方式。

M文件函数是MATLAB中功能语句的集合。

使用M文件,可以以程序的形式重复处理数据,从而提高工作效率。

3.1局部变量和全局变量

⒈局部变量

局部变量的作用范围仅限于M文件中的一段程序,一旦运行超出该段程序,变量的值将不再保留。

⒉全局变量

全局变量用global关键字进行声明,其作用范围为整个M文件。

注:

如果希望扩展变量的作用范围,可以采用两种方法:

一种方法是将该变量作为函数参数进行传递,另一种方法是将该变量声明为全局变量。

将变量作为函数参数进行传递的方法更保险,因为声明为全局变量时,可能会在无意中更改该变量的值。

此时程序往往可以运行,但结果可能不正确,而且错误较难排查。

3.2表达式

与其他程序语言类似,MATLAB提供了数学表达式功能。

但是,与大多数程序语言不同的是,这些表达式主要是针对数组进行操作的。

3.2.1数值表示

MATLAB使用传统的数值表示方法。

对于比较长的数,使用科学计数法,用字母e指定以10为底的幂次。

虚数用i或j作后缀。

下面是一些合法的数值表示:

8-668.5187181.5022e-187.0218e238i-3.14159j6e8i

所有数值在内部保存为IEEE浮点标准指定的long型格式。

浮点数据的精度为16个小数位。

范围大约为

3.2.2运算符

⒈算术运算符

算术运算符用于实现四则运算以及幂、转置等运算,如表3-1所示。

表3-1算术运算符

运算符

说明

运算符

说明

+

.\

左除

-

^

.*

'

复数共轭转置

./

右除

()

指定计算顺序

⒉比较运算符

比较运算符用于比较两个数据的大小,如表3-2所示。

表3-2比较运算符

运算符

描 述

运算符

描 述

<

小于

>=

大于或等于

<=

小于或等于

==

等于

>

大于

~=

不等于

⒊逻辑运算符

逻辑运算符用于判断对象或对象之间的某种逻辑关系。

如表3-3所示。

表3-3逻辑运算符

运算符

函数

描述

&

and

两个数组中相同位置都非0时返回1,否则返回0。

|

or

两个数组中相同位置都为0时返回0,否则返回1。

~

not

对数组中元素取反,即非0值变为0,0变为1。

xor

两个数组中相同位置的元素只有一个非0时返回1,否则返回0。

any(C)

如果向量中有任何一个元素非0,返回1;否则返回0。

all(C)

如果向量中所有元素非0,返回1;否则返回0。

&&

如果符号两端的表达式均为真,返回1;否则返回0。

||

如果符号两端的表达式有一个为真,返回1;否则返回0。

演示:

A=[01101.5];B=[13001];

C=[A;B]

C=

01.00001.000001.5000

1.00003.0000001.0000

c1=A&B

c1=

01001

c2=A|B

c2=

11101

c3=~A

c3=

10010

c4=xor(A,B)

c4=

10100

D=[012;0-38;050]

D=

012

0-38

050

d1=any(D)

d1=

011

d2=all(D)

d2=

010

⒋运算符的优先级

按照优先级别,各种运算符有下面的先后次序。

◣小括号();

◣转置(.')、幂(.^)、复数共轭转置(')、矩阵的幂(^);

◣一元的加(+)、一元的减(-)、逻辑否(~);

◣乘(.*)、右除(./)、左除(.\)、矩阵乘(*)、矩阵右除(/)、矩阵左除(\);

◣加(+)、减(-);

◣冒号操作符(:

);

◣比较运算符:

<、<=、>、>=、==、~=;

◣&(and);

◣|(or);

◣&&;

◣||。

3.2.3处理字符串表达式

可以处理字符串表达式使得MATLAB语言更强大灵活。

处理字符串表达式需要使用eval函数和feval函数。

●eval函数可以处理包含MATLAB表达式、语句或函数调用的字符串。

使用该函数的最简单的语法格式为:

eval('string')将字符串string表示的命令转换成命令执行

演示:

程序代码:

%说明eval函数的例子

forn=3:

5

magic_str=['M',int2str(n),'=magic(n)'];

eval(magic_str)

end

运行结果:

M3=

816

357

492

M4=

162313

511108

97612

414151

M5=

17241815

23571416

46132022

101219213

11182529

●feval函数与eval函数的区别在于,该函数执行函数而不是MATLAB表达式。

要执行的函数通过函数句柄或包含函数名称的字符串在第一个参数中指定。

演示:

程序代码:

%说明feval函数的例子

k=input('Choosefunctionnumber:

');

x=input('Entervalue:

');

fun=[@sin;@cos;@log];%构建了一个函数句柄数组

feval(fun(k),x)

3.3流程控制

程序控制语句包括条件控制、循环控制、错误控制和终止运行控制等。

3.3.1条件控制

条件控制使得可以有选择地运行程序块。

当条件可以用是或否来回答时,使用if语句;当条件根据表达式值的不同可有多个选项时,使用switch和case语句。

⒈if/elseif语句

●最简单的if/elseif语句如下所示:

ifexpression

statements;

end

功能:

如果表达式expression的值为真,就执行if与end语句之间的代码,否则跳过。

●如果有两个选择,使用下面的if/elseif语句:

ifexpression

statements1;

else

statements2;

end

功能:

如果表达式(expression)的值为真,就执行if与else语句之间的代码;否则执行else与end语句之间的代码。

●如果有多个选择时,使用下面的if/elseif语句:

ifexpression1

statements1

elseifexpression2

statements2

elseifexpression3

statements3

else

statements

end

功能:

若表达式expression1为真,执行代码statements1;若表达式expression2为真,执行代码statements2;若表达式expression3为真,执行代码statements3;…;否则执行代码statements。

注:

在解决多个选择问题时,用elseif语句比用if语句简单。

例如:

程序段:

ifA

x=a

else

ifB

x=b

else

ifC

x=c

else

x=d

end

end

end

可简化为程序段:

ifA

x=a

elseifB

x=b

elseifC

x=c

else

x=d

end

⒉switch/case语句

该语句的通用格式为:

switchswitch-expressin

casecase-expressin1,

statements1;

casecase-expressin2,

statements2;

casecase-expressin3,

statements3;

otherwise

statements;

end

其中,switch-expressin给出开关条件,当有case-expressin与之匹配时,就执行其后的语句,如果没有case-expressin与之匹配,就执行otherwise后面的语句。

在执行过程中,只有一个case命令被执行,当执行完命令后,程序就跳出分支结构,执行end下面的语句。

3.3.2循环控制

使用循环控制语句,可以重复执行代码块。

用for语句执行指定次数;while语句适合于循环一直执行,直到满足条件为止的情况;continue和break语句对退出循环给予更多控制。

⒈for循环

for循环允许一组命令以固定的和预定的次数重复执行,for循环的一般形式如下:

forv=expression

statement;

end

⒉while循环

while循环以不定的次数来求一组命令的值。

while循环的一般形式如下:

whileexpression

statements;

end

只要表达式expression中的元素为真,就执行while和end语句之间的命令。

⒊continue命令

continue命令经常与for或while语句一起使用,其作用是结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判断。

⒋break命令

break命令也经常与for或while等语句一起使用,其作用是终止本次循环,跳出最内层的循环。

使用break命令可以不必等到循环自然结束,而是根据条件,退出循环。

3.3.3错误控制

try…catch语句进行错误捕获,它把有可能引起异常的语句放在try控制块中。

这样当try控制块中statement语句引起异常时,catch控制块就可以捕获它,并针对不同的错误类型,进行不同的处理。

try-catch命令的调用格式为:

try

statement

statement

catch

statement

statement

end

3.3.4程序终止控制

return命令能使当前正在运行的函数正常退出,并返回调用它的函数,继续运行。

这个语句经常用于函数的末尾,以正常结束函数的运行。

break,continue和return函数比较容易混淆,表3-4对它们进行了比较详细的比较:

表3-4break,continue和return函数的区别

函数

用在何处

描述

break

for或while循环

它出现时,退出循环,在嵌套的循环中,进入相邻的外层循环

continue

for或while循环

在本循环中跳过剩余的语句,进入本循环的下一次迭代

return

任意位置

它出现时,立即退出函数,进入函数的调用函数中

3.3.5应用实例

例3-1 筛选数据

程序一代码:

x=[-23-10-8-4-2-10134578910141934];

n=numel(x);y=[];z=[];l=0;k=0;

fori=1:

n

ifx(i)>=-10&&x(i)<=10

l=l+1;

y(l)=x(i);

else

k=k+1;

z(k)=x(i);

end

end

y=y

z=z

其运行结果:

y=

-10 -8 -4 -2 -1 0 1 3 4 5 7 8 9 10

z=

-23 14 19 34

程序二代码:

%筛选数据

x=[-23-10-8-4-2-10134578910141934];

n=numel(x);y=[];z=[];l=0;k=0;

fori=1:

n

ifx(i)>10

l=l+1;

y(l)=x(i);

end

ifx(i)<-10

k=k+1;

z(k)=x(i);

end

end

y=y

z=z

其运行结果:

y=

141934

z=

-23

程序三代码:

%筛选数据

x=[-23-10-8-4-2-10134578910141934];

n=numel(x);y=[];z=[];l=0;k=0;

fori=1:

n

ifx(i)>10

l=l+1;

y(l)=x(i);

end

continue

ifx(i)<-10

k=k+1;

z(k)=x(i);

end

end

y=y

z=z

其运行结果:

y=

141934

z=

[]

程序四代码:

%筛选数据

x=[-23-10-8-4-2-10134578910141934];

n=numel(x);y=[];z=[];l=0;k=0;

fori=1:

n

ifx(i)>10

l=l+1;

y(l)=x(i);

end

break

ifx(i)<-10

k=k+1;

z(k)=x(i);

end

end

y=y

z=z

其运行结果:

y=

[]

z=

[]

3.4函数

MATLAB提供了很多内部数学函数,包括abs、sqrt、exp和sin等。

对负数取平方根或对数不会导致错误,MATLAB会自动返回复数计算结果。

MATLAB还提供了很多高级的数学函数,包括bessel和gamma函数等。

这些函数的大部分都接受复数参数。

在命令窗口键入命令helpelfun,可以查看此类函数的列表。

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

helpspecfun

helpelmat

有些函数如sqrt和sin是内部函数,内部函数是MATLAB内核的一部分,所以它们的计算效率很高,但计算细节无法获取。

其他函数,如gamma和sinh,是用M文件实现的。

内部函数和外部函数有一些不同,例如,对于内部函数,无法看到代码;对于其他函数,则可以看到代码,甚至可以修改代码。

3.4.1主函数

M文件中的第1个函数称为主函数。

主函数后面可以有多个子函数。

在大多数情况下,主函数是M文件中可以从MATLAB命令行或从另一个M文件函数调用的惟一函数。

调用该函数的M文件的名称。

例如,若下面函数的文件名为example3_4_1.m。

functiony=average(x)

%计算向量元素的平均值

y=sum(x)/length(x)

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

example3_4_1([126042])

执行结果:

ans=

38

注:

在具体应用时,使主函数名与M文件的文件名相同为好。

如果函数名与文件不同,必须用文件名调用函数。

3.4.2子函数

M文件中可以包含一个以上的函数。

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

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

function[avg,med]=example3_4_2(u)%主函数

%本函数用内部函数计算均值和中值

n=numel(u);

avg=mean(u,n);

med=median(u,n);

functiona=mean(v,n)%此子函数用于计算均值

a=sum(v)/n;

functionm=median(v,n)%此子函数用于计算中值

w=sort(v);%排序

ifrem(n,2)==1%奇数

m=w((n+1)/2);

else

m=(w(n/2)+w(n/2+1))/2;

end

子函数mean和median计算输入数据的均值和中值。

主函数example3_4_2确定参数列表的长度并调用子函数,将列表长度传递给它们。

调用函数:

[a,b]=example3_4_2([1247934567932])

执行结果:

a=

12.1818

b=

7

注:

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

从M文件内部调用函数时,MATLAB首先检查文件,看函数是否子函数。

然后检查该名称的私有函数,最后搜索路径上独立M文件或内部函数。

因为首先检查子函数,所以可以用相同名称的子函数覆盖已经存在的M文件。

3.4.3嵌套函数

可以在一个函数中嵌套定义一个或多个函数。

嵌套函数具有类似下面的形式。

functionx=A(p1,p2)

functiony=B(p3)

end

end

注:

M文件函数一般不需要end语句,但使用嵌套函数时需要此语句。

如果M文件包含一个或多个嵌套函数,必须在M文件中用end语句终止所有函数,不管它们是否包含嵌套函数。

调用某个嵌套函数时,可以从紧邻它的上一级函数中调用,从同一父函数中相同级别的函数中调用,或在任何更低级别的函数中调用。

例如,下面的嵌套函数中,函数A可以调用函数B或D,但不能调用C或E;函数B可以调用函数D,函数D可以调用函数B;函数C可以调用函数B或D,但不能调用函数E。

functionA(x,y)%主函数

B(x,y);

D(y);

functionB(x,y)%嵌套在A函数中

C(x);

D(y);

functionC(x)%嵌套在B函数中

D(x);

end

end

functionD(x)%嵌套在A函数中

E(x);

functionE%嵌套在D函数中

end

end

end

3.4.4私有函数

私有函数是private子目录中的函数。

它们只对父目录中的函数可见。

例如,假设目录newmath位于MALAB搜索路径上,则newmath目录的private子目录中包含的函数只能被newmath目录中的函数调用。

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

3.4.5重载函数

有时候同一个函数可以用于多种情况,对应地有不同的输入参数,此时要用到重载函数。

比如绘制二维线形图的plot函数就有多种重载形式,下面是其中两种。

plot(y)

plot(x1,y1,┄)

这两个函数具有相同的函数名,不同的参数。

调用plot函数时MATLAB会根据函数的参数自动选择使用。

重载函数的创建涉及到面向对象编程方面的知识,请参见MATLAB高级编程内容。

3.5M文件

如果一些比较多的命令行需要重复调用,常常将它们写成M文件的形式保存。

3.5.1脚本式M文件和函数式M文件

创建和编辑M文件的工作在M文件编辑器中完成,单击MATLAB主界面的左上角的图标“

”或在主界面中依次选择File→New→M-file菜单项,打开M文件编辑器(见图3-1)。

图3-1 M文件编辑器窗口

若要绘一个单位球面,并且要让球面看起来比较平滑,可以在命令窗口中键入下面三行命令:

sphere

shadinginterp

axisequal

其中,第一行是一个sphere命令函数,表示绘制一个单位球面,第二行命令对球面进行插值着色,第三行设置坐标系,使各坐标方向上的度量单位相同(如果不同,球面看起来象椭球面);也可以在M文件编辑器中输入下列代码:

sphere

shadinginterp

axisequal

并保存为脚本式M文件example3_5_1a.m。

在M文件编辑器窗口单击图标“

”或依次选择Debug→Run,均可生成单位球面(见图3-2)。

图3-2 单位球面

注:

将MATLAB的CurrentDirectory修改为文件example3_5_1a.m保存的路径时,在命令窗口中键入example3_5_1a也可以生成单位球面。

现在假设有时需要生成球面,而有时则需要生成柱面。

可以考虑编制一个绘图函数,这个函数有一个surface参数。

调用这个函数时,如果将该参数设置为“sphere”,生成一个单位球面;设置为“cylinder”时,生成一个单位柱面。

在M文件编辑器中输入下面代码:

functionexample3_5_1b(surface)

switchsurface

case'sphere'

sphere

case'cylinder'

cylinder

end

shadinginterp

axisequal

并保存为example3_5_1b.m。

就可以在命令窗口中调用example3_5_1b函数了(当前目录窗口CurrentDirectory应为文件example3_5_1b.m保存的路径)。

在命令窗口中键入下面的命令行:

example3_5_1b('sphere')

将生成单位球面(见图3-2)。

键入

example3_5_1b('cylinder')

将生成单位柱面。

M文件example3_5_1b.m称为函数式M文件,它含有function关键字;而而脚本式M文件example3_5_1a.m中没有function关键字,也没有输入参数。

概括而言,脚本式M文件和函数式M文件的区别可纳为表3-5。

表3-5脚本式M文件和函数式M文件的区别

脚本式M文件

函数式M文件

不接受输入参数,没有返回值。

可以接受输入参数,可以有返回值。

基于工作空间中数据进行操作

默认时,文件中参数的作用范围只限于函数内部

3.5.2M文件的基本结构

函数式M文件比较标准的格式如下所示,其中黑体加粗的文字表示M文件的基本组成部分:

function[x,y]=myfun(a,b,c)函数定义行

%帮助文本的第一行(用一行文字来综述函数的功能)

%帮助文本(用一行或多行文本来解释如何使用函数)

(在命令行中键入“help”时可以使用它)

%函数体(一般从第一个空白行后开始)

%注释(描述函数的行为,输入输出的类型等。

(在命令行中键入“help”时不会显示注释文本)

x=prod(a,b);%开始编写函数代码

所以,一个完整的函数式M文件应该包括函数定义行、帮助文本的第一行、帮助文本、函数体、注释和函数代码等方面的内容,其中函数定义行和函数代码是必需的。

3.5.3函数的参数

调用函数时,调用者通过一个参数列表传递数据,并获取返回值。

⒈检查输入参数的个数

利用nargin和nargout函数可以确定函数输入参数和输出参数的个数。

然后可以根据参数个数用条件语句完成不同的任务,例如:

functionc=example3_5_3a(a,b)

if(nargin==1)

   c=a.^2;

elseif(nargin==2)

  c=a+b;

end

当给定一个输入参数时

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 韩语学习

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2