




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章MATLAB基础1.1MATLAB概论1.2MATLAB的基本特性1.3数据类型1.4复数1.1.1MATLAB概述
1.MATLAB的由来和发展
MATLAB是矩阵实验室(MatrixLaboratory)之意,其名字由Matrix和Laboratory两词的前三个字母组合而成。除具备卓越的数值计算能力外,MATLAB还提供了具有专业水平的符号计算、文字处理、可视化建模仿真和实时控制等功能。
1.1MATLAB概论
MATLAB因其具有强大的数学运算能力、方便实用的绘图功能,以及语言的高度集成性,在其他科学与工程领域的应用越来越广。到目前为止,MATLAB已发展成为国际上最优秀的科技应用软件之一,其强大的科学计算与可视化功能、简单易用的开放式可扩展环境,以及多个面向不同领域而扩展的工具箱(Toolbox)支持,使得它在许多学科领域成为计算机辅助设计与分析、算法研究和应用开发的基本工具和首选平台。
MATLAB目前主要应用于信号处理、控制系统、神经网络、模糊逻辑、小波分析和系统仿真等方面,可利用MATLAB进行数值分析、数值和符号计算、工程与科学绘图、控制系统的设计与仿真、通信系统的设计与仿真、数字(音频、视频)信号处理、数字图像处理、财务与金融工程计算等。
2.MATLAB的优、缺点
MATLAB具有以下优点:
(1)容易使用。MATLAB是MathWorks公司用C语言开发的,其与C语言的语法结构、流程控制等有许多相似之处,有些几乎完全一致,具有C语言基础的读者能够很容易地掌握MATLAB。
(2)可以支持多种操作系统,如Windows、UNIX等。
(3)丰富的内部函数和工具箱。
(4)强大的图形和符号功能。MATLAB本身带有强大的绘图库函数,可绘制2D和3D图形。
(5)可以自动选择算法。许多MATLAB函数都带有算法的自适应能力,可根据情况自动选择最合适的算法,减少和避免死循环或其他由于算法不当引起的错误。
(6)与其他软件和语言有良好的对接性,如与Maple、C、Basic、Fortran等软件可以实现很方便的连接,能够充分利用各种资源提高编程效率。
MATLAB具有以下缺点:
(1)运行效率较低。由于MATLAB是一种合成语言,因此与一般的高级语言相比,用它编写的程序其运行时间往往要长一些。
(2)价格昂贵。
3.应用程序接口
由于MATLAB的代码编译器采用伪编译的方式,因此在MATLAB中编写的程序无法脱离MATLAB的工作环境而独立运行。针对这个问题,MATLAB提供了应用程序接口,允许MATLAB与其他应用程序进行数据交换,一般来说,按目的可将它们分为以下三种:
(1) MEX文件。MEX文件作为一种动态链接库文件,必须通过在MATLAB的工作环境内调用才能运行。
(2) MAT文件。MAT文件用于数据交换,不能利用MATLAB提供的功能来完成计算任务。MAT文件由SAVE命令生成,由LOAD命令调用。
(3)拓广MATLAB的应用范围和应用手段的开发应用程序。这是MATLAB引擎应用程序,是一种可以独立执行的应用程序,但在应用程序执行时,将在后台启动一个MATLAB进程,用于接收从应用程序发送来的指令并执行,然后按照要求返回计算结果。1.1.2MATLAB用户界面
MATLABR2010a的用户界面如图1-1所示,其中主要包括主菜单、工具栏和默认设置下打开的窗口。这些默认窗口包括命令(Command)窗口、命令历史(CommandHistory)窗口、工作空间(Workspace)窗口、当前路径(CurrentDirectory)窗口。此外还有编译窗口、图形窗口和帮助窗口等其他窗口。图1-1MATLABR2010a的用户界面
1.命令(Command)窗口
在默认设置下,命令窗口自动显示于MATLAB界面中,如果用户只想调出命令窗口,也可以选择“Desktop|DesktopLayout|CommandWindowOnly”命令。MATLABR2010a
用户界面的中间窗口默认为命令窗口。
命令窗口中除了执行MATLAB命令外,还支持下列一些通用命令:
cddirtypeclearclfpackclcechoholddisppathsaveloaddiaryquit!(调用DOS命令)
2.命令历史(CommandHistory)窗口
命令历史窗口显示用户在命令窗口中所输入的每条命令,并标明了使用时间,这样可以方便用户的查询。
如果用户想再次执行某条已经执行过的命令,只需在命令历史窗口中双击该命令。
3.工作空间(Workspace)窗口
工作空间窗口用来显示当前计算机内存中MATLAB变量的名称、数据结构、字节数及其类型。
默认设置下,工作空间窗口自动显示于MATLAB界面中。在工作空间窗口可以查询以前出现的变量值、变量名和变量的详细信息。
如果要查看以前的变量值,只需输入该变量名即可,如:
>>grade4
grade4=
128如果要查看以前的变量值,但忘记了该变量名,则输入who即可查看曾经使用过的变量名,如:
>>who
Yourvariablesare:
grade1grade2grade3grade4total
如果要查看以前变量值的详细信息,输入whos即可。
4.当前文件夹(CurrentFolder)窗口
当前文件夹窗口会显示当前用户工作的文件夹所在的路径。如果用户改变文件的路径或所在文件夹,则当前文件夹窗口会显示新的路径和文件夹。
在命令窗口中输入cd命令,并按Enter键确认,即显示当前MATLAB工作所在目录:
>>cd
D:\MyDocuments\MATLAB
在命令窗口中输入dir命令,并按Enter键确认,即显示当前MATLAB工作所在目录中的内容。
5.帮助系统
在MATLAB中有以下几种获得帮助的途径。
1)联机帮助系统
在主菜单中,选择“help”下拉菜单进入联机帮助系统,打开“帮助”浏览器。
在命令窗口中输入命令helpwin、helpdesk、doc,可进入联机帮助系统。
进入“help”窗口后,按菜单和控件操作。
2)在命令窗口查询帮助
(1) help命令:
在命令窗口键入help命令可以列出帮助主题;
键入“help函数名”可以得到指定函数的在线帮助信息。
(2) lookfor命令:
在命令窗口键入“lookfor关键词”,即可根据关键词进行查找(扫描命令第一注释行)搜索出一系列与给定关键词相关的命令和函数。
(3)其他帮助命令:exist、what、who、whos、which。
3)模糊查询
输入命令的前几个字母,然后按Tab键,就可以列出所有以这几个字母开始的命令和函数。
注意:lookfor和模糊查询查到的不是详细信息,通常还需要在确定了具体函数名称后用help命令显示与之相关的详细信息。1.1.3MATLAB基本用法
1.命令行交互应用
在Windows桌面上双击MATLAB图标,启动MATLAB程序,在一段提示信息后,会出现MATLAB命令窗口(CommandWindow),以及系统提示符“>>”。
MATLAB是个交互系统,用户可以在提示符后键入各种命令,通过移动上、下箭头可以调出以前输入的命令,拖动滚动条还可以查看以前的命令及其输出信息。
可通过键入quit或exit或选择相应的菜单来退出MATLAB。终止MATLAB运行会引起工作空间中变量的丢失,因此在退出前,应先键入save命令,保存工作空间中的变量以便以后使用。
键入save命令即将所有变量作为文件存入磁盘MATLAB.mat中,在下次启动MATLAB时,键入load命令,则将变量从MATLAB.mat中重新调出。
save和load命令后可以跟文件名或指定的变量名,如仅有save,则只能将变量存入MATLAB.mat中;如输入savetemp命令,则表示将当前系统中的变量存入temp.mat中,其命令格式如下:
savetempx:仅仅存入x变量。
savetempXYZ:存入X、Y、Z变量。
loadtemp:重新从temp.mat文件中提出变量,load也可读ASCII数据文件。
2.编程应用
与C语言等编程软件一样,在MATLAB中建立一个程序文件的方法为:单击菜单命令“New | Script(以前版本为M_file)”,建立一个新的MATLAB程序文件(.M文件),之后即可进行编译、调试和运行等操作。1.1.4MATLAB工具箱
MATLAB的另一强大功能是提供了一系列工具箱,这些工具箱可广泛用于各领域的计算与仿真,包括主工具箱(MATLABMainToolbox)和各种工具箱(toolbox)。按工具箱的使用领域分类,可将其分为通用型和专用型。
(1)功能型工具箱(通用型)主要用来扩充MATLAB的数值计算、符号运算、图形建模仿真、文字处理以及与硬件实时交互等功能,能够用于多种学科。
(2)领域型工具箱(专用型)是学科专用工具箱,其专业性很强,包括控制系统工具箱(ControlSystemToolbox)、信号处理工具箱(SignalProcessingToolbox)、财政金融工具箱(FinancialToolbox)等。 1.2MATLAB的基本特性
1.2.1数学运算
MATLAB的数学运算包括四则运算和乘方等运算,用于数学计算的数学运算符如表1-1所示。1.2.2关系运算
MATLAB的关系运算符包括了所有常用的比较运算,如表1-2所示。两个数通常可以用六种关系来进行描述:小于(<)、小于或等于(<=)、大于(>)、大于或等于(>=)、等于(==)和不等于(~=)。
MATLAB的关系运算符可以用来比较两个维数相同的数组(矩阵),或用来把一个数组中的每个元素与一个标量比较,结果都返回一个与原来数组同维数的数组。比较两个元素的大小时,如果关系式为“真”,则结果为1;如果关系式为“假”,则结果为0。例如关系式4+3<=6(数学语言表示4与3的和小于等于6),通过上面的叙述可知,此关系式的结果为0,标明关系式为假。关系运算符的运算法则为:
(1)当两个比较量是标量时,直接比较两数的大小。若关系成立,关系表达式为“真”,结果为1;否则为0。
(2)当参与比较的两个量是维数相同的数组(矩阵)时,比较是对两数组(矩阵)相同位置的元素按标量关系运算规则逐个进行,并给出元素比较结果。最终的关系运算的结果是一个维数与原数组(矩阵)相同的数组(矩阵),它的元素由0或1组成。
(3)当参与比较的一个是标量,而另一个是数组(矩阵)时,则把标量与数组(矩阵)的每一个元素按标量关系运算规则逐个比较,并给出元素比较结果。最终的关系运算的结果是一个维数与原数组(矩阵)相同的数组(矩阵),它的元素由0或1组成。
1.数组与一个标量比较
当一个数组与一个标量比较时,首先将标量扩展成与数组同维数的数组,然后进行逐元素比较,结果返回一个与原来数组同维数的数组。例如:
>>m=1:9
m=
123456789
>>bj=m>5
bj=
000001111
从以上运行结果可以看到,在数组m中,凡是大于5的对应的结果都为“真”,返回1;其他为“假”,返回0。
2.数组(矩阵)间的比较
数组(矩阵)间的比较,也是对应元素逐个进行比较,结果返回一个与原来数组同维数的数组(矩阵)。例如:
>>n=9-m
n=
876543210
>>tf=(m==n)
tf=
000000000由上述可知,由于两个数组的对应元素都不相等,结果是返回一个全“假”的数组。
>>df=(m>n)
df=
000011111
满足条件的元素位置返回“真”,不满足条件的元素位置返回“假”。
注意:如果数组具有不同的大小,那么运行时将会产生错误。
3.关系表达式与数学运算表达式的混合运算
关系表达式可以与数学运算表达式进行混合运算。数组中满足条件的元素位置(即为“真”)返回1,为“假”返回0,然后进行运算。例如:
>>gh=n-(m>4)
gh=
87653210-11.2.3逻辑运算
在MATLAB中,有三类基本逻辑运算:“与”、“或”和“非”,包含&、&&、|、|| 和~共五种,如表1-3所示。逻辑运算的运算法则为:
(1)在逻辑运算中,确认非零元素为真,用1表示;零元素为假,用0表示。当运算结果为真时,返回值为1;当运算结果为假时,返回值为0。
(2)“与”、“或”操作符号可以比较两个标量或者两个通解数组(或矩阵)。设参与逻辑运算的是a和b两个标量,那么当a、b全为非零时,a&b的运算结果为1,否则为0;a、b中只要有一个非零,a|b的运算结果都为1。
(3)若参与逻辑运算的一个是标量、一个是矩阵,那么运算将在标量与矩阵中的每个元素之间按标量规则逐个进行。最终运算结果是一个与矩阵同维的矩阵,其元素由1或0组成。
(4)若参与逻辑运算的是两个同维矩阵,那么运算将对矩阵相同位置上的元素按标量规则逐个进行。最终运算结果是一个与原矩阵同维的矩阵,其元素由1或0组成。
(5)逻辑“非”是一元操作符(或叫单目运算符),也服从矩阵运算规则。但是,对于数组(矩阵),逻辑“非”运算是针对于数组(矩阵)中每个元素的。同样,当逻辑为真时,返回值为1;当逻辑为假时,返回值为0。例如,当a是零时,~a运算结果为1;当a非零时,运算结果为0。
(6)在算术、关系、逻辑运算中,算术运算优先级最高,逻辑运算优先级最低。
1.逻辑“与”
逻辑“与”,在数组之间进行逐元素的“与”操作。例如:
>>a=1:6
a=
123456
>>b=5-a
b=
43210-1
>>m=(a>2)&(a<5)
m=
001100
又如:
>>n=(a<2)&(a>5)
n=
000000
2.逻辑“或”
逻辑“或”,在数组之间进行逐元素的“或”操作。例如:
>>b=5-a
b=
43210-1
>>n=(b>1)|(b<0)
n=
111001
前三个数字满足第一个条件(b>1),输出1;最后一个数字满足第二个条件(b<0),输出1。
3.逻辑“非”
逻辑“非”,即“NOT”,是个一元操作符,对运算对象取反。凡是“真”的,在该位置输出结果就为0,其他为1。例如:
>>x=~(b>2)
x=
0011111.2.4标量关系表达式的避绕式操作
标量关系表达式的避绕式操作符(&&和||)只适用于标量关系表达式,“避绕式”(Short-Circuiting)是指MALTAB按顺序执行由这两个操作符连接的标量关系表达式,当执行到某一表达式时,就已经可以确定其结果,不再执行(绕过)后面的表达式,直接给出逻辑结果。例如:
>>a=0;b=pi;
>>a==0||b~=1
ans=
1第一个表达式为“真”,于是就绕过后面的表达式不再执行,直接给出逻辑结果为“真”,输出1。
>>b==1&&a==0
ans=
0
第一个表达式为“假”,于是就直接给出逻辑结果为“假”,输出0。
>>a==0||(1/a)<1
ans=
1
由于第一个表达式已经为“真”,整个操作结果必将为“真”,于是直接给出逻辑结果为“真”,输出1,绕过后面的表达式不再执行,否则将出现除数为0的警告。1.2.5运算符的优先级
MALTAB中各运算符的优先级顺序如表1-4所示。MATLAB在执行运算时,首先执行具有较高优先级的运算,然后执行具有较低优先级的运算。如果两个运算的优先级相同,则按从左到右的顺序执行。
在运算的过程中,关系运算是在所有数学运算之后进行的,所以下面两个表达式是等价的,均产生结果1。
>>6+3<2+10
>>(6+3)<(2+10)1.2.6关系与逻辑函数
除了关系运算符和逻辑运算符外,MATLAB还提供了几个关系与逻辑函数。这些关系与逻辑函数及其功能如表1-5所示。
MATLAB还提供了一些函数,用于检验某个特定的值是否存在或者某一条件是否成立,并返回相应的逻辑结果。由于这些函数大多以“is”开头,因此称为“is族”函数。1.2.7标点符号的使用
1.分号与逗号
(1)分号(;)用于区分数组的行,或者用于一个语句的结尾处,表明命令行的结束,并取消运行结果的显示。
(2)逗号(,)用作数组列分隔符,函数参数分隔符或用于分隔语句。
在一个语句行中,可以输入多个语句,语句之间用逗号或分号分隔,使用逗号时,运行结果将在窗口中显示;而使用分号时,运行结果将被隐藏。
2.百分号
百分号(%)用于在程序文本中添加注释,增加程序的可读性。百分号之后的文本都将视作注释,系统不对其进行编译。MATLAB中的百分号类似于C语言的“//”符号。
3.括号
在MATLAB中只用小圆括号(())代表运算级别,方括号([])只用于生成向量和矩阵,花括号({})用于生成单元数组。
4.续行符号
3个点组成的省略号(…)作为续行符号。在编写程序时,往往会遇到命令行很长或一行写不下的情况。为了阅读起来方便或使程序看起来更清晰,可以将程序分成多行分别书写,使用续行符号连接。例如:
>>x =5*6...
+8-5
x=33
>>total=...
5*6+8-5
total=33使用续行符号可将两行命令连接为一行,但使用续行符号的位置要周期,否则将会出错。例如:
>>total=...5*6+8-5
???
|Error:Incompleteormisformedexpressionorstatement.
>>value1=10;value2=9;
>>total=value1+value...2
???Undefinedfunctionorvariable'value'.
>>total=value1+value...
2
???2
|
Error:MissingMATLABoperator.1.2.8常用的操作命令和快捷键
为方便用户操作,MATLAB中定义了一些快捷键。在使用MATLAB语言编制程序时,掌握一些常用的操作命令和键盘操作技巧,可以提高编程效率,起到事半功倍的效果。
1.常用的操作命令
MATLAB常用的操作命令如表1-7所示。
2.常用的键盘操作和快捷键
MATLAB常用的键盘操作和快捷键,如表1-8所示。1.2.9简单的计算器使用法
要在MATLAB下进行基本数学运算,用户可以像使用计算器一样,只需将运算式直接输入提示号“>>”之后,并按Enter键。例如:
>>(5*2+1.3-0.8)*10/25
ans=
4.2000
MATLAB会将运算结果直接存入变量ans,代表MATLAB运算后的答案(Answer)并将其数值显示出来。现举例说明:已知机电系一年级有3个班,每班30人;二年级有3个班,每班35人;三年级有4个班,每班30人;四年级有4个班,每班32人。求机电系一共有多少人?
在MATLAB中,该问题可以有多种方法解决,如可使用直接输入法、存储变量法和编程计算等。下面就前两种方法举例说明。
1.直接输入法
使用如表1-1所示的数值运算符号,直接在命令窗口输入表达式进行计算。表达式的书写规则如下:
(1)在大多数情况下,MATLAB对命令行中的空格不予处理,因此在书写表达式时,可以利用空格调整表达式的格式,使表达式更易于阅读。
(2)MATLAB的表达式遵守四则运算法则,即运算从左到右进行,乘法和除法优先于加减法,指数运算优先于乘除法,括号的运算级别最高。在有多重括号存在的情况下,从括号的最里边向最外边逐渐扩展。
例如,在命令窗口输入:
>>3*30+3*35+4*30+4*32
ans=
443
由于没有指定输出结果的名称,MATLAB默认将运算结果命名为ans,它是answe的缩写。
(3)需要注意的是,右除和左除的意义并不相同。右除为常规的除法,其意义为
>>6/3
ans=2
而左除的意义为
>>6\3
ans=0.5000
2.存储变量法
直接在命令窗口输入变量、表达式进行计算:
>>grade1=3*30;
>>grade2=3*35;
>>grade3=4*30;
>>grade4=4*32;
>>total=grade1+grade2+grade3+grade4
total=443
由于MATLAB具有记忆功能,因此先前的运算信息都被保存起来,可供以后的运算使用。例如,求每个年级的平均人数:
>>total/4
ans=
110.75001.2.10MATLAB支持的数据结构与数据类型
1.矩阵
MATLAB最基本的数据结构是复数矩阵,在命令窗口输入一个复数矩阵非常简单,例如下面的语句:
>>B=[1+9i,2+8i,3+7j;4+6j5+5i,6+4i;7+3i,8+2j1i]
可输入一个矩阵B,矩阵B的各行元素由分号分隔,而同行中不同列元素由逗号或空格分隔,回车后显示的结果如下:
B=
1.0000+9.0000i2.0000+8.0000i3.0000+7.0000i
4.0000+6.0000i5.0000+5.0000i6.0000+4.0000i
7.0000+3.0000i8.0000+2.0000i
0+1.0000i
其中,元素1+9i表示复数项,实矩阵、向量或标量均可更容易地以这样的表述方法输入。如果赋值表达式末尾有分号,则其结构将不显示,否则将显示出全部结果。
2.多维数组
在MATLAB中数组、向量和矩阵的概念是经常混用的,事实上数组、向量和二维矩阵在本质上没有任何区别,都是以矩阵的形式保存的。MATLAB的数据结构只有矩阵一种形式(可细分为普通矩阵和稀疏矩阵),但是数组与矩阵的某些运算方法是不同的。
3.字符串与字符串矩阵
MATLAB的字符串是由单引号括起来的。如可以使用下面命令赋值:
>>strA='Thisisastring.'
多个字符串可以用str2mat()函数构造出字符串矩阵。
4.单元数组结构
用类似矩阵的记号将给复杂的数据结构纳入一个变量之下,与矩阵中的圆括号表示下标类似,单元数组由大括号表示下标。
>>B={1,‘China’,1949,[100,80,50;45,60,66;67,12,90;10,8,44]}
B=
[1]'China'[1949][4×3double]
访问单元数组应该由大括号进行,如第4单元中的元素可以由下面的语句得出
>>B{4}
ans=
1008050
456066
671290
10844
>>B{2}
ans=China
5.结构体
MATLAB的结构体类似于C语言的结构体数据结构,结构体中的每个成员变量用点号表示。如用下面的语句可以建立一个小型的数据库:
>>student.number=122;
>>='李宏';
>>student.height=183;
>>student.test=[100,85,88;77,68,95;67,66,90;90,90,78];其中,test成员为单元型数据。删除成员变量可以由rmfield()函数完成,添加成员变量可以直接由赋值语句完成。另外,数据读取还可以由setfield()和getfield()函数完成,所显示数据库结构如下:
>>student
student=
number:122
name:‘李宏’
height:183
test:[4x3double]
表示变量student的name成员变量。而获得该成员则比C语言更直观,即用“.”访问,而不用“->”。
>>
ans=李宏
6.类与对象
类与对象是MATLABR5.0开始引入的数据结构。在实际工具箱的设计中使用了很多的类,例如在控制系统工具箱中定义了LTI(线性时不变系统)类,并在此基础上定义了其子类,即传递函数类TF、状态方程类SS、零极点类ZPK和频率响应类FR。 1.3数据类型
1.3.1整数
1.整数数据类型
MATLABR2010a支持8位、16位、32位和64位的有符号和无符号整数数据类型,如表1-9所示。不同的整数数据类型除了定义范围不同外,其性质都相同。
由于MATLAB默认的数据类型为双精度型的阵点数,因此要使用整型变量时,需明确地将其定义为整数数据类型。
2.常用的整数函数
3.整数运算
类型相同的整数之间可以进行运算,返回相同类型的结果。进行加、减和乘法运算比较简单,而进行除法运算稍微复杂一些,这是因为在多精度情况下,整数的除法不一定能得到整数的结果。当进行除法时,MATLAB首先将两个数视为双精度类型进行运算,然后将结果转化为相应的整型数据。MATLAB中不允许进行不同整数类型之间的运算。由于每种整数数据类型都有相应的取值范围,因此数学运算有可能产生结果溢出。MATLAB利用饱和处理处理此类问题,即当运算结果超出了此类数据类型的上限或下限时,系统将结果设置为该上限或下限。
例1-3-1在整数运算中的数据溢出问题。
解语法如下:
>>x=int8(100);
>>y=int8(90);
>>z=x+y
z=
127
结果(190)溢出上限,因此输出结果为上限(127)。
>>x-3*y
ans=
-27
3*y结果为(270)溢出上限,结果为127,继续计算(100-127),得到最后结果
-27。
>>x-y-y-y
ans=
-128
计算x-y-y-y时,从左到右进行计算,结果溢出下限,因此结果为-128。1.3.2浮点数与精度函数
MATLAB的默认数据类型是双精度数值类型(double)。
1.单精度和双精度数据类型的取值范围
在不同计算机系统上运行的MATLAB中,其单精度与双精度数据类型与取值范围会有所不同,这与硬件有关。具体的单精度和双精度数据类型的取值范围和精度,可以通过realmin()、realmax()、eps()函数进行查看。
(1) realmin()函数。该函数返回MATLAB语言能够表示的最小的归一化正浮点数,任何小于该数的都不是规范的IEEE标准,都会发生溢出。
(2) realmax()函数。该函数返回MATLAB语言中能够表示的最大的归一化正浮点数,任何大于该数的数都不是规范的IEEE标准,都会发生溢出。
类似的函数还有intmarx()和intmin():intmax()表示返回指定的整数数据类型能表示的最大的正整数;intmin()表示返回指定的整数数据类型能表示的最小的正整数。例1-3-2
举例说明在MATLAB中单精度浮点数和双精度浮点数数据类型的取值范围和精度的规定。
解
(1)函数:
>>intmax('int32')
ans=2147483647
>>intmin('int32')
ans=-2147483648
(2)单精度浮点数:
>>realmin('single')
ans=1.1755e-038
>>realmax('single')
ans=3.4028e+038
(3)双精度浮点数:
>>formatlong
>>n=realmin
n=2.2251e-308
>>realmax
ans=1.7977e+308
2.单、双数据类型之间的转换
几乎在所有的情况下,MATLAB的数据都是以双精度来表示的,为了节省存储空间,MATLAB也支持单精度数据类型的数组。单精度数据类型的定义和操作与整型数据类型基本相同。
创建单精度类型的变量时与创建整型变量类似,需要声明变量类型。例如:
>>a1=zeros(1,5,'single')
a1=
00000
>>b1=eye(3,'single')
b1=
100
010
001最后一个参数指定数据类型为single。
使用class()函数可查询一个数据的类型。例如:
>>class(a1)
ans=single
在MATLAB中,各种数据类型之间可以互相转换,转换方式如下:
(1) datatype(variable),其中,datatype为目标数据类型,variable为待转换的变量。例如:
>>c=single(1:7)
c=
1234567
表示将默认的双精度类型转换为单精度类型。
(2)使用cast()函数转换。cast(x,'type'),表示将x的类型转换为'type'指定的类型。例如:
>>d=cast(6:-1:0,'single')
d=
6543210
转换时,如果由高精确度数据类型转换为低精确度数据类型,则对数据进行四舍五入;如果由定义范围大的数据类型转换为定义范围小的数据类型,则返回目标数据类型的上限或下限。
3.单精度数据类型的运算
单精度数据类型的数据进行运算时,返回值为单精度,即单精度之间或单精度与双精度数据之间进行运算时,返回值都为单精度。例如:
>>c.^d
ans=
>>class(ans)
ans=
single
c、d都是单精度,运算结果ans仍为单精度。单精度数据(c)与双精度数据(pi)进行运算时,返回值仍为单精度。例如:
>>c*pi
ans=
3.14166.28329.424812.566415.708018.849621.9911
>>class(ans)
ans=
single
>>class(pi)
ans=
double
4.eps()函数
MATLAB中还存在一个用双精度表示的浮点相对误差限eps,定义为1与大于1的最小数之间的步进距离,用eps获得。
(1)
eps:返回从1.0到下一个最大的双精度数的距离,eps=2^(-52)。例如:
>>eps
ans=
2.2204e-016
(2)eps(‘double’):等同于eps或eps(1.0)。例如:
>>eps(‘double’)
ans=
2.2204e-016
(3) eps('single'):等同于eps(single(1.0))或single(2^-23)。例如:
>>eps('single')
ans=
1.1921e-007
(4) d=eps(X):d是从abs(X)到下一个与X精度相同的较大浮点数的正距离,X可以是单精度或双精度。对于所有的X,都有eps(X)=eps(-X)=eps(abs(X))。
5.有限精度产生的结果
MATLAB的有限精度的局限性往往会产生不寻常的结果。例如:
>>0.42-0.5+0.08
ans=
-1.387778780781446e-017
>>0.08-0.5+0.42
ans=
0
>>0.08+0.42-0.5
ans=
0从数学角度来讲,上述三个式子的结果都应该是0,但实际计算结果并非如此。这是因为,并不是所有的数字都可以用双精度数精确地表示。当出现这种情况时,MATLAB会用一个尽可能精确的数字表示,这将会出现误差。实际上,这种误差常常是很小的,并且通常是在比较两个数是否相等时才会出现。
MATLAB有限精度局限性的第二个后果出现在函数运算中。例如:
>>sin(0)
ans=
0
>>sin(pi)
ans=
1.224646799147353e-016
从数学角度来讲,上述两个式子的结果都应该是0,但实际计算结果并非如此,sin(pi)并不为0。
综上所述,上述两种情况出现的误差都是很小的,都小于eps。
6.数字的输入/输出格式
数字的默认格式为实数,保留小数点后4位浮点数,其他形式可通过相应的命令得到。无论何种形式,数值的存储值和内部运算值都是双精度的,数值范围为10-308~10308。1.3.3数字数据类型操作函数
在表1-11中,列出了MATLAB支持的数字数据类型操作函数,其中,“type”包括“numeric”、“integer”、“float”和所有的数据类型。
例如:使用isa()函数判断p。
>>isa(pi,‘single’)
ans=0
>>isa(pi,‘double’)
ans=11.3.4变量和常量
1.变量变量是MATLAB的基本元素之一,变量命名规则与其他计算机语言类似。MATLAB语言的赋值语句有以下两种:变量名=运算表达式
[返回变量列表]=函数名(输入变量列表)
MATLAB不要求对所使用的变量进行事先说明,也不需要指定变量的类型,系统会根据该变量被赋予的值或对该变量所进行的操作来自动确定变量的类型。若变量名已存在,将由新值代替旧值,新类型代替旧类型。
MATLAB的变量必须符合下列命名规则:
(1)变量名区分大小写。如pi和Pi是两个不同的变量。
(2)变量名长度不超过31(这是对于32位计算机而言;如果是64位计算机,则长度应不超过63)个字符,超过的部分将会被忽略不计。
(3)变量名必须以字母开头,其后可以为字母、数字或者下划线。
(4)变量名中的字母大小写有以下规定:
①矩阵大写:A、B、C。
②向量小写:u、v、w、x、y、z。
③函数小写:f、g、h、fun、f1、f2。
④常量小写:alpha、beta、a、b、c。
(5)变量名中不允许出现标点符号,也不能包含空格。MATLAB中的变量名不支持其他符号,因为其他符号在MATLAB中具有特殊意义。
局部(local)变量与全局(global)变量:前者在M文件内起作用,后者需要声明,在前面加global,常用大写英文。
2.常量
在MATLAB中有一些特定的量,它们已经被预定义为某个特定的值,因此这些量被称为常量,主要有pi(圆周率p)、inf和eps等。实际上,MATLAB支持IEEE标准的运算符号,如inf表示无穷大,NaN(NotaNumber)为0/0、0*inf或inf/inf等运算结果。MATLAB中常用的常量如表1-12所示。表中:pi:代表常量。
inf:代表常量无穷大。MATLAB允许的最大数是21024,当超过该数时,将被认为是inf。用inf代表常量无穷大,当出现此情况时,将会给出警告信息,但不会导致系统死机,这是MATLAB与其他软件相比,所具有的优点之一。
eps:eps用于判断是否为0元素的误差限。一般情况,MATLAB默认误差限为eps,eps=2.2204e-016。
i或j:表示纯虚数,即sqrt(-1)。如果在程序中,没有对i或j专门定义,则默认为是纯虚数,可直接使用。如果在程序中,对i或j进行了重新定义,则保留新值。1.3.5逻辑数据
1.逻辑数据类型
MATLAB中用1和0分别表示逻辑“真”和逻辑“假”。一些MATLAB函数或操作符会返回逻辑“真”或逻辑“假”以表示条件是否满足,如表达式(5*10)>40返回逻辑“真”。MATLAB中返回逻辑值的函数和操作符如表1-13所示。
2.逻辑数组
在MATLAB中,也存在逻辑数组,如下面的表达式表示返回逻辑数组:
>>[3040506070]>40
ans=
00111
1)逻辑数组的创建
(1)创建逻辑数组最简单的方法为直接输入元素的值为true或者false。
(2)逻辑数组也可以通过逻辑表达式生成。
2)逻辑数组的应用
(1)用于条件表达式。如果仅当条件成立时执行某段代码,可以应用逻辑数组进行判断和控制。
(2)用于数组索引。在MATLAB中支持通过一个数组对另一个数组进行索引。
3)逻辑数组的判断
MATLAB中提供了一组函数用于判断数组是否为逻辑数组,如表1-15所示。
1.4复数
1.4.1复数的创建
复数由实部和虚部两部分组成,基本虚数单位为。在MATLAB中,虚数单位由i或者j表示,即i=j=sqrt(-1),其值在工作间中都显示为0+1.0000i。
在MATLAB中,可以通过两种方法创建复数:一种是直接输入法;另一种是使用complex()函数。
1.直接输入法
直接输入法创建复数的示例如下:
>>c1=1-2i
c1=
1.0000-2.0000i
>>c2=1+2j
c2=
1.0000+2.0000i
>>c3=sqrt(-2)
c3=
0+1.4142i注意:在MATLAB7.0以前的版本中,只有数字才可以与i或者j连接,因此在使用表达式时,要乘以1i或1j来获得虚部。如:
>>c4=5+sin(.5)*1j
c4=
5.0000+0.4794i
而在MATLAB7.0以后版本中,不需要乘以1i或1j,可直接乘以i或j来获得虚部。如:
>>c4=5+sin(.5)*j
c4=
5.0000+0.4794i
2.使用complex()函数
complex()函数的调用方法如下:
(1) c=complex(a,b)。返回结果c为复数,其实部为a,虚部为b。输入参数a和b可以是标量,或者是维数、大小相同的向量;也可以是矩阵或者多维数组。输出参数和输入参数的结构相同。a和b可以有不同的数据类型,当a和b为各种不同的类型时,返回值分别如下:
当a和b中有一个为单精度时,返回结果为单精度;
如果a和b其中一个为整数类型,则另外一个必须有相同的整数类型,或者为双精度型,返回结果c为相同的整数类型。
>>c1=complex(1,2)
c1=
1.0000+2.0000i
>>c2=complex(1,-2)
c2=
1.0000-2.0000i
(2) c=complex(a)。只有一个输入参数,返回结果c为复数,其实部为a,虚部为0。但是此时c的数据类型为复数。
>>c1=complex(2)
c1=
2
3.复数的虚部和实部
imag()、real()函数表示分别返回复数的虚部和实部,如:
>>real(c2)
ans=
1
>>imag(c2)
ans=
-2
>>c2r=real(c2)
c2r=
1
>>c2i=imag(c2)
c2i=
-2
4.复数的模、辐角和共轭复数
(1)求复数的模使用abs()函数。abs()函数求复数虚部和实部的平方和再开平方的方式求出复数的模,其函数的MATLAB表达式为
abs(X)=sqrt(real(X).^2+imag(X).^2)例如:c1=1.0000+2.0000i
>>abs(c1)
ans=
2.2361
(2)求复数的辐角使用angle()函数。例如:
>>angle(c1)
ans=
1.1071
(3)求共轭复数使用conj()函数。例如,复数Z=real(Z)+i*imag(Z),其共轭复数为
conj(Z)=real(Z)-i*imag(Z)例如:
>>c2=conj(c1)
c2=1.0000-2.0000i1.4.2复数运算在MATLAB中无需做任何特殊操作,就可以对复数进行处理,复数数学运算的表达式与实数数学运算的表达式相同。常用的复数运算函数总结如下:
real(A):求复数或复数矩阵A的实部;
imag(A):求复数或复数矩阵A的虚部;
conj(A):求复数或复数矩阵A的共轭;
abs(A):求复数或复数矩阵A的模;
angle(A):求复数或复数矩阵A的相角,单位为弧度。例如,利用前面的结果计算:
>>c5=c2/c3
c5=
-1.4142-0.7071i复数的运算结果,仍然是复数,但是当运算的结果虚部为0时,MATLAB会自动去掉该虚部。如:
>>c1+c2
ans=
1例1-4-1
求下列复数的实部和虚部、共轭复数、模和辐角。
(1)(2)(3)(4)解在MATLAB命令窗口中输入:
>>a=[1/(3+2i),1/i-3i/(1-i),(3+4i)*(2-5i)/2i,i^9-4*i^21+i];
>>real(a)
ans=0.23081.5000-3.50000
>>imag(a)
ans=-0.1538-2.5000-13.0000-2.0000
>>conj(a)
ans=0.2308+0.1538i1.5000+2.5000i-3.5000+13.0000i0+2.0000i
>>abs(a)
ans=0.27742.915513.46292.0000
>>angle(a)
ans=-0.5880-1.0304-1.8338-1.5708
例1-4-2
复数的指数和对数运算:
(1) log(-i) (2) log(-1+3i)
解在MATLAB命令窗口中输入:
>>log(-i)
ans=0-1.5708i
>>log(-1+3i)
ans=1.1513+1.8925i1.4.3欧拉恒等式的转换
欧拉恒等式把一个复数的极坐标形式和它的直角坐标形式联系起来,即(1.4.1)其中,极坐标表达式用极径M和极角θ表示,直角坐标形式用复数a+bj表示。这两种表达式的关系如下:
(1)极径M和极角θ用abs()和angle()函数来完成:
>>c6=1-2j
c6=
1.0000-2.0000i
>>M=abs(c6)
M=
2.2361
>>angle_c6=angle(c6)
angle_c6=
-1.1071此时的极角是弧度(radians),如果用度数表示,要进行转换:
>>deg_c6=angle_c6*180/pi
deg_c6=
-63.4349
(2)直角坐标形式的虚部和实部分别用imag()、real()函数来表示。如:
>>a=real(c6)
a=
1
>>b=imag(c6)
b=
-2第2章向量、数组和矩阵2.1矩阵的特征参数运算2.2向量、数组与矩阵的创建2.3向量、数组和矩阵的寻址与赋值2.4标准矩阵与特殊矩阵2.5基本的四则运算2.6向量、数组和矩阵的其他运算2.7矩阵的操作2.8单元数组2.9结构体 2.1向量、数组与矩阵的创建
2.1.1向量的创建
1.简单向量的创建
在MATLAB中,生成向量(一维数组)最简单的方法就是在命令窗口中按一定格式直接输入。输入的格式要求是:向量元素用“[]”括起来,元素之间用空格、逗号或者分号相隔。需要注意的是,用它们相隔生成的向量形式是不相同的。
(1)用空格或逗号生成不同列的元素,即行向量。(2)用分号生成不同行的元素,即列向量。例如:
>>a1=[15;21;27;93;101];
>>a1
a1=
15
21
27
93
101
>>a2=[15,21,27,93,101];
>>a2
a2=
>>a3=[1234]
a3=
1234
2.冒号表达式创建等差数组
当向量的元素过多,同时向量各元素有等差的规律时,采用直接输入法将显得过于繁琐。针对这种情况,可以使用冒号(:)和linspace()函数来生成等差元素向量。
冒号表达式是MATLAB中最具特色的表示方法,其调用格式如下:
a=j:i:k
这一语句可以生成一个行向量,其中,j为向量的起始值,i为增量步距,而k为向量的终止值。当i==0、i>0且j>k或i<0且j<k时,返回一个空向量。例如:
>>vec1=10:5:60
vec1=
1015202530354045505560
a=j:k
当冒号表达式用于整数,不指定步距时,默认步距为1,步距可省略,等同于[j,j+1,...,k],而当j>k时,返回一个空向量。例如:
>>D=1:4
D=
1234
冒号表达式也可用于实数。使用两个冒号生成一个实数向量。例如:
>>E=0:.1:.5
E=
00.10000.20000.30000.40000.5000
3.linspace()函数与等差数组的创建
linspace()函数类似于冒号操作符,生成以线性间隔分布的向量,相邻的两个数据的差保持不变,构成等差数列,其语法格式如下:
(1) y=linspace(a,b)。在a、b之间(包括a、b)生成100点线性间隔分布的行向量y,即向量y有100个元素,a为起始元素,b为结束元素。
(2) y=linspace(a,b,n)。在a、b之间(包括a、b)生成n点线性间隔分布的行向量y,即向量y有n个元素。如果n小于2,linspace返回b。例如:
>>vec2=linspace(10,60,11)
vec2=
1015202530354045505560
>>vec3=linspace(10,60,10)
vec3=
10.000015.555621.111126.666732.222237.777843.333348.888954.444460.0000
4.等比数组的创建
冒号表达式能够直接指定数据间的增量,而不用指定数据点的个数。Linspace()函数能够直接指定数据点的个数,而不用指定数据间的增量。这两种方式产生的数据都是等间隔分布的,即等差向量。而实际中也需要使用等比数列向量。函数logspace()用来生成等比形式排列的行向量。函数logspace()的用法如下:
(1) X=logspace(a,b)。在10a和10b之间生成50个以对数间隔等分数据的行向量。构成等比数列,数列的第一项X(1)=10a,最后一项X(50)=10b。
(2) X=logspace(a,b,n)。在a和b之间生成n个对数间隔等分数据的行向量。构成等比数列,数列的第一项X(1)=10a,最后一项X(n)=10b。
(3) y=logspace(a,pi)。在10a和之间生成等比数列的点。用于数字信号处理,在单位圆上等间隔频率采样。2.1.2向量的转置与操作
1.普通转置
使用分号可以生成列向量;使用冒号、linspace()和logspace()函数可以生成行向量;使用转置符号(')可以将行向量转成列向量,b=a',即b是a的转置向量。例如:
>>f=1:4
f=
1234
>>F=f'
F=
1
2
3
4
再次使用转置符号(')可将列向量转回成行向量。
2.点转置
MATLAB还提供了点转置(.')符号。对实数而言,(.')与(')操作是等效的;对于复数,(')操作结果是复数共轭转置。也就是说,在转置过程中,虚部的符号也改变了,而(.')操作只转置,不进行共轭操作。例如:
>>f=1:3
f=
123
>>x=complex(f,f)
x=
1.0000+1.0000i2.0000+2.0000i3.0000+3.0000i
>>y=x'
y=
1.0000-1.0000i
2.0000-2.0000i
3.0000-3.0000i
>>z=x.'
z=
1.0000+1.0000i
2.0000+2.0000i
3.0000+3.0000i
3.向量元素的操作或运算
MATLAB亦可取出向量中的一个或一部分元素进行操作或运算。例如:
>>x(3)=2%将向量x的第三个元素更改为2
x=10.000047.50002.000022.500060.0000
>>x(6)=10 %在向量t加入第六个元素,其值为10
x=10.000047.50002.000022.500060.000010.0000
>>x(4)=[]%将向量t的第四个元素删除,[]代表空集合
x=10.000047.50002.000060.000010.0000
4.适用于向量的常用函数
适用于向量的常用函数有以下几种:
(1) min(x)、max(x):向量x的元素的最小值、最大值。
(2) mean(x):向量x的元素的平均值。
(3) median(x):向量x的元素的中位数。
(4) std(x):向量x的元素的标准差。
(5) diff(x):向量x的相邻元素的差。
(6) sort(x):对向量x的元素进行排序(Sorting)。
(7) length(x):向量x的长度(元素个数)。
(8) norm(x):向量x的欧氏(Euclidean)长度。
(9) sum(x)、prod(x):向量x的元素总和、总乘积。
(10) cumsum(x)、cumprod(x):向量x元素的累计总和、累计总乘积。
(11) dot(x,y)、cross(x,y):向量x和y的内积、外积。2.1.3向量的点乘、叉乘和混合积
1.向量的点乘
向量的点乘又称为内积或数量积,顾名思义,它所得的结果是一个数。
(1) |a.b|=|a|*|b|*cos(a,b),其结果是标量,(a,b)为两个向量的夹角。它的几何意义是两个向量的模和两个向量之间的夹角余弦三者的乘积。或者说是其中一个向量的模与另一个向量在这个向量的方向上的投影的乘积。
(2)若向量a=(a1,b1,c1)、向量b=(a2,b2,c2),则a·b=a1a2+b1b2+c1c2,即点乘的运算是:对应元素相乘后求和,相当于sum(a.*b)。
(3)在MATLAB中,实现点乘的函数是dot(),该函数的用法:dot(A,B),其中A和B的维数必须相同。例如:
>>x1=[11223344];x2=[1234];
>>X=dot(x1,x2)
X=330
>>sum(x1.*x2)
ans=330
当A和B都是行向量时,dot(A,B)与A.*B' 相同,例如:
>>x1*x2'
ans=330当A和B都是列向量时,dot(A,B)与A'*B相同,例如:
>>y1=[1;2;3]
y1=
1
2
3
>>y2=[4;5;6]
y2=
4
5
6
>>y=dot(y1,y2)
y=
32
>>y1'*y2
ans=
32
2.向量的叉乘
叉乘也叫向量的外积、向量积。顾名思义,它所得的结果是一个向量。
(1) |a×b|=|a|*|b|*sin(a,b),其结果是矢量,(a,b)为两个向量的夹角。两个向量叉积的几何意义是指以两个向量模的乘积为模,方向和两个向量构成右手坐标系(即过两个相交向量的交点,并与这两个向量所在平面垂直)的向量。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论