MATLAB语言基础教程
目 录
一 MATLAB概述„„„„„„„„„„„„„„„„„„„„„„„„„1 1.1 MATLAB是21世纪的科学计算软件„„„„„„„„„„„„„„„„„1
1.1.1 MATLAB具有强大的科学计算及数据处理能力„„„„„„„„„„1 1.1.2 MATLAB具有出色的图形处理功能„„„„„„„„„„„„„„„1 1.1.3 MATLAB程序语言简单易用„„„„„„„„„„„„„„„„„„2 1.1.4 MATLAB功能强大„„„„„„„„„„„„„„„„„„„„„„3 1.1.5 MATLAB开放性强„„„„„„„„„„„„„„„„„„„„„„4 1.2 MATLAB软件的发展历史„„„„„„„„„„„„„„„„„„„„„„
5
1.3 MATLAB软件的组成„„„„„„„„„„„„„„„„„„„„„„„„
6
1.4 MATLAB软件的安装„„„„„„„„„„„„„„„„„„„„„„„„
7
1.4.1 运行MATLAB的基本要求„„„„„„„„„„„„„„„„„„„7 1.4.2 安装MATLAB„„„„„„„„„„„„„„„„„„„„„„„„7 1.5 MATLAB的基本操作„„„„„„„„„„„„„„„„„„„„„„„9
1.5.1 MATLAB的桌面平台„„„„„„„„„„„„„„„„„„„„„9 1.5.2 MATLAB的使用技巧„„„„„„„„„„„„„„„„„„„„„13 1.5.3 MATLAB的帮助系统„„„„„„„„„„„„„„„„„„„„„15 二 MATLAB变量与表达式„„„„„„„„„„„„„„„„„„„„„17 2.1 MATLAB的变量„„„„„„„„„„„„„„„„„„„„„„„„„17
2.1.1 数据类型„„„„„„„„„„„„„„„„„„„„„„„„„„
1
7
2.1.2 变量类型„„„„„„„„„„„„„„„„„„„„„„„„„„
1
9
2.1.3 存储形式„„„„„„„„„„„„„„„„„„„„„„„„„„
2
0
2.1.4 变量命名规则„„„„„„„„„„„„„„„„„„„„„„„„
2
0
2.1.5 MATLAB预定义的变量„„„„„„„„„„„„„„„„„„„„21 2.2 MATLAB的表达式„„„„„„„„„„„„„„„„„„„„„„„„21
2.2.1 表达式„„„„„„„„„„„„„„„„„„„„„„„„„„„
2
1
2.2.2 数据的输出格式„„„„„„„„„„„„„„„„„„„„„„„
2
2
2.2.3 MATLAB常用数学函数„„„„„„„„„„„„„„„„„„„„23 三 MATLAB矩阵及运算„„„„„„„„„„„„„„„„„„„„„„25 3.1 MATLAB矩阵的生成和修改„„„„„„„„„„„„„„„„„„„„25
3.1.1 矩阵的生成„„„„„„„„„„„„„„„„„„„„„„„„„
2
5
3.1.2 矩阵的修改„„„„„„„„„„„„„„„„„„„„„„„„„
2
8
3.2 MATLAB矩阵的保存与提取„„„„„„„„„„„„„„„„„„„„33 3.3 MATLAB的向量运算„„„„„„„„„„„„„„„„„„„„„„„33
3.3.1 加减及与数加减„„„„„„„„„„„„„„„„„„„„„„„
3
3
3.3.2 数乘„„„„„„„„„„„„„„„„„„„„„„„„„„„„
3
4
3.3.3 点积、叉积及混合积„„„„„„„„„„„„„„„„„„„„„
3
4
3.4 MATLAB的矩阵运算„„„„„„„„„„„„„„„„„„„„„„„35
3.4.1 矩阵的基本运算„„„„„„„„„„„„„„„„„„„„„„„
3
5
3.4.2 矩阵的函数运算„„„„„„„„„„„„„„„„„„„„„„„
3
9
3.5 MATLAB的阵列运算„„„„„„„„„„„„„„„„„„„„„„„45
3.5.1 阵列的基本运算„„„„„„„„„„„„„„„„„„„„„„„
4
6
3.5.2 阵列的函数运算„„„„„„„„„„„„„„„„„„„„„„„
4
8
3.6 关系运算与逻辑运算„„„„„„„„„„„„„„„„„„„„„„„49
3.6.1 关系运算„„„„„„„„„„„„„„„„„„„„„„„„„50 3.6.2 逻辑运算„„„„„„„„„„„„„„„„„„„„„„„„„51 3.6.3 逻辑运算函数„„„„„„„„„„„„„„„„„„„„„„„52 四 MATLAB字符串„„„„„„„„„„„„„„„„„„„„„„„53 4.1 字符串的基本操作„„„„„„„„„„„„„„„„„„„„„„„53
4.1.1 字符串给变量赋值„„„„„„„„„„„„„„„„„„„„„„
5
3
4.1.2 字符串长度„„„„„„„„„„„„„„„„„„„„„„„„„
5
3
4.2 字符串函数„„„„„„„„„„„„„„„„„„„„„„„„„„54 五 MATLAB语句„„„„„„„„„„„„„„„„„„„„„„„„„58 5.1 控制语句„„„„„„„„„„„„„„„„„„„„„„„„„„„58
5
.
1
.
1
f
o
r
-e
n
d
语
句„„„„„„„„„„„„„„„„„„„„„„„„„58
5
.
1
.
2
w
h
i
l
e
-e
n
d
语
句„„„„„„„„„„„„„„„„„„„„„„„„59
5
.
1
.
3
i
f
-e
l
s
e
-e
n
d
语
句„„„„„„„„„„„„„„„„„„„„„„„„60
5
.
1
.
4
s
w
i
t
c
h
-c
a
s
e
语
句„„„„„„„„„„„„„„„„„„„„„„„61 5
.
2
输
入
与
输
出
语
句„„„„„„„„„„„„„„„„„„„„„„„„„„61
5.2.1 输入语句„„„„„„„„„„„„„„„„„„„„„„„„„„
6
1
5.2.2 输出语句„„„„„„„„„„„„„„„„„„„„„„„„„„
65
.
3
辅
助
2 语
句„„„„„„„„„„„„„„„„„„„„„„„„„„„„„63
5.3.1 注释语句„„„„„„„„„„„„„„„„„„„„„„„„„„
6
3
5.3.2 中断语句„„„„„„„„„„„„„„„„„„„„„„„„„„
6
3
5.3.3 暂停语句„„„„„„„„„„„„„„„„„„„„„„„„„„
6
3
5.3.4 回显语句„„„„„„„„„„„„„„„„„„„„„„„„„„
6
4
5.3.5 错误消息显示语句„„„„„„„„„„„„„„„„„„„„„„
6
4
5.3.6 绘图语句„„„„„„„„„„„„„„„„„„„„„„„„„„
6
4
六 M文件与M函数„„„„„„„„„„„„„„„„„„„„„„„„65 6.1 M文件„„„„„„„„„„„„„„„„„„„„„„„„„„„„„65 6.2 M函数„„„„„„„„„„„„„„„„„„„„„„„„„„„„„66 七 数学图形的绘制„„„„„„„„„„„„„„„„„„„„„„„„„68 7.1 二维数学图形绘制„„„„„„„„„„„„„„„„„„„„„„„„68
7.1.1 基本图形函数„„„„„„„„„„„„„„„„„„„„„„„68 7.1.2 常用图形函数的使用„„„„„„„„„„„„„„„„„„„„68 7.1.3 数学图形的修饰„„„„„„„„„„„„„„„„„„„„„„73 7.1.4 绘制矩阵的图形„„„„„„„„„„„„„„„„„„„„„„74 7.1.5 特殊二维图形函数„„„„„„„„„„„„„„„„„„„„„75 7.2 三维数学图形绘制„„„„„„„„„„„„„„„„„„„„„„„77
7.2.1 绘制三维曲线„„„„„„„„„„„„„„„„„„„„„„„77 7.2.2 绘制三维曲面„„„„„„„„„„„„„„„„„„„„„„„77
一 MATLAB概述
1.1 MATLAB是21世纪的科学计算软件
在科学研究和工程应用等领域中会涉及到大量的科学计算问题,自从计算机出现以来,人们就一直在使用计算机这个有力的工具帮助解决科学计算问题,并由此发明了许多用于科学计算的程序语言,如BASIC、FORTRAN、C等等。随着时代的变化、随着计算机的普及和快速发展,计算机程序语言在不断地变化发展、在不断地推陈出新。在当今时代,什么程序语言是最流行的科学计算语言呢?答案是——MATLAB语言。MATLAB之所以能够成为最好的和最流行的科学计算语言,是因为它具有强大的科学计算及数据处理能力和出色的图形处理功能等特点。
1.1.1 MATLAB具有强大的科学计算及数据处理能力
MATLAB拥有600多个工程中要用到的数学运算函数,可以方便地实现用户所需的各种计算功能。函数中所使用的算法都是科研和工程计算中的最新研究成果,而且经过了各种优化及容错处理,因此使用起来稳定性和可靠性非常高,在通常情况下,可以用它来代替底层编程语言,如C和C++等。在计算要求相同的情况下,使用MATLAB的编程工作量会大大减少。MATLAB函数所能解决的问题包括矩阵运算、多维数组操作(阵列运算)、复数的各种运算、三角函数和其他初等数学函数运算、非线性方程求根、线性方程组的求解、微分方程及偏微分方程组的求解、符号运算、傅立叶变换和数据的统计分析、工程中的优化问题、稀疏矩阵运算、建模和动态仿真等等。
1.1.2 MATLAB具有出色的图形处理功能
1
在科学计算中,往往需要用各种图形把数值计算的结果形象地表现出来,以帮助人们更好地理解、认识和发现其中的科学规律。MATLAB不仅提供数值计算功能和符号运算功能,而且自诞生之日起就具有方便的数据可视化功能,使计算结果的可视化要求得到充分满足。MATLAB在二维曲线和三维曲面的绘制和处理等方面的功能比一般数据可视化软件更加完善,在一些其他软件所没有的功能(例如图形的光照处理、色度处理以及四维数据的表现等)方面也表现得非常出色。在MATLAB 6.x中有一个对图形对象属性进行设置的图形属性编辑界面,该界面比 MATLAB 5.x中的界面功能更为全面,操作也更为方便。MATLAB 6.x对图形的输出也做了适当的改进,提供了更为丰富的属性设置,以提高图形输出的效果。对一些特殊的可视化要求,例如图形动画等,MATLAB也有相应的功能函数,保证了用户不同层次的要求。另外,新版本的MATLAB还着重在图形用户界面(GUI)的制作上做了很大的改善,对这方面有特殊要求的用户也可以得到满足。
MATLAB将数值计算功能、符号运算功能和图形处理功能高度地集成在一起,在数值计算、符号运算和图形处理上做到了无缝的衔接,极大地方便了用户,这是它在科学计算中能得到广泛应用的重要原因之一。
1.1.3 MATLAB程序语言简单易用
早期用于科学计算的计算机语言,由于计算机内存容量和运算速度的限制等原因,常常要定义常量、变量、向量和矩阵等的不同的数据类型,结果导致编程过于复杂化。和这些语言不一样,MATLAB语言对他们进行了高度抽象,实现了数据类型的高度统一,即常量、变量、向量和矩阵等都具有相同的数据类型。MATLAB语言认为所有的数据都是一个对象类,都具有相同的属性。因此,用户不需要事先分别定义常量、变量、向量和矩阵等的数据类型就可以直接使用他们(当然MATLAB的这种设计思想是以高性能计算机的出现和普及作为前提条件的),编程得到了很大简化。例如,在MATLAB中,基本的计算单元用复双精度矩阵来表示,其大小是n行m列,矩阵各数据元素存放在两个双精度向量中,一个存放实部数据(指针pr指向它),另一个存放虚部数据(指针pi指向它)。如果是实数,则复双精度矩阵中pi为空。复数或实数则可以理解为1×1的矩阵。
MATLAB语言是一种“数学形式的语言”,它的操作和功能函数指令就是用平时计算机和数学书上的英文单词和符号来表达的,比BASIC、FORTRAN和C等语言更接近于人2
们书写的数学计算公式、更接近于人们进行科学计算的思维方式,用MATLAB语言编写程序犹如在演算纸上排列公式与求解问题,故有人称MATLAB编程语言为“演算纸”式科学算法语言。因此,MATLAB语言简单自然,学习和使用更容易。
MATLAB程序文件是一个纯文本文件,扩展名为m,用任何字处理软件都可以对它进行编辑。MATLAB本身就像一个解释系统,对其中的函数程序的执行以一种解释执行的方式进行,程序不必经过编译就可以直接运行,而且能够及时报告出现的错误,进行出错原因分析。因此,程序调试容易、编程效率高。
MATLAB的用户界面精致,接近Windows的标准界面,人机交互性强,操作简单。新版本的MATLAB提供了完整的联机查询、帮助系统,极大地方便了用户的使用。例如,在开发环境中,MATLAB 6.x提供了强大的帮助功能,几乎所有的帮助都能以在线帮助的形式出现,同时也提供了一种全新的帮助浏览器,更加方便用户获得所需要的信息。与MATLAB 5.x相比,MATLAB 6.x改进了原有的系统结构,将各种对MATLAB应用提供支持的系统集成为全新的MATLAB开发环境,其中最为明显的就是,集各种对MATLAB文件、数据变量进行操作的工具以及MATLAB自身的辅助工具为一体的MATLAB桌面系统。该桌面系统就是用户对MATLAB操作的面板。从开始应用MATLAB到退出MATLAB,几乎所有具体的操作都将在桌面系统内完成。
1.1.4 MATLAB功能强大
MATLAB为许多专业领域开发了功能强大的模块集或工具箱(一般都是由这些领域的专家们开发的),用户可以直接使用这些工具箱而不需要自己编写代码。目前,MATLAB已经把工具箱延伸到了科学研究和工程应用的诸多领域,诸如概率统计、NAG和偏微分方程求解、样条拟合、优化算法、模糊逻辑、工程规划、模型预测、模型处理、神经网络、数据采集、交流通信、DSP与通讯、数字信号处理、小波分析、光谱分析、图像处理、系统辨识、控制系统设计、非线性控制设计、鲁棒控制、QFT控制设计、LMI控制、实时工作、数据库接口、金融分析、金融管理、地图工具、嵌入式系统开发、实时快速原型及半物理仿真、定点仿真、电力系统仿真等等,都在工具箱(Toolbox)家族中有了自己的一席之地。
在模型化和系统级仿真方面,MATLAB开发了分支产品Simulink,主要用来实现对工程问题的模型化和动态仿真。Simulink体现了模块化设计和系统级仿真的具体思想,
3
使得建模仿真如同搭积木一样简单。Simulink对仿真的实现可以应用于动力系统、信号控制、通信设计、金融财会及生物医学等各个领域的研究中。
MATLAB留有与其它实用的程序接口。MATLAB可以方便地与FORTRAN,C等语言接口,以充分利用各种资源。用户只需将已有的EXE文件转换成MEX文件,就可以方便地调用有关程序和子程序。新版本的MATLAB可以利用MATLAB编译器和C/C++数学库和图形库,将自己的 MATLAB程序自动转换为独立于MATLAB运行的C和C++代码。MATLAB还和符号运算最为强大的工具软件Maple有很好的接口,这也大大扩充了MATLAB的符号运算功能。此外,在MATLAB 6.x中增加了与Java的接口,并为实现两者的数据交换提供了相应的函数库。
1.1.5 MATLAB开放性强
MATLAB强大的功能与其开放性设计思想是分不开的,正是这种开放性设计思想,增强了MATLAB强大的生命力。
MATLAB对函数程序的执行是以一种解释的方式进行的,MATLAB完全成了一个开放的系统,用户可以方便地看到函数的源程序,也可以方便地开发自己的程序,甚至创建自己的“库”。
在工具箱方面,该公司本身就推出了30多个应用工具箱,而世界上超过200家公司开发出与MATLAB兼容的第三方产品,这些产品向用户提供更多的工具箱、模块集、与其他商业产品的接口等。
MATLAB是一个开放的环境。全世界各地,特别是许多大学都建立了MATLAB学习研究小组,他们也通过互联网交流学习心得和经验,MathWorks公司特别鼓励这种交流,以丰富和扩展MATLAB的使用范围。目前,MATLAB 7.0版本已经面世,其功能和使用便捷程度又有了很大提高。MATLAB的相关书籍超过涉及19种不同文字600种。
由于MATLAB具有以上其他计算语言无法比拟的优势,在美国及其他发达国家的理工科院校里,MATLAB已经成为了一门必修的课程,是攻读学位的大学生、硕士生和博士生必须掌握的基本工具。在科研院所、大型公司或企业的工程计算部门,MATLAB也是最为普遍的计算工具之一。由此可见,MATLAB就是21世纪真正的科学计算语言。
1.2 MATLAB软件的发展历史
4
MATLAB是由MATrix和LABoratory两个词的前三个字母组合而成的,含义是矩阵实验室。它是MathWorks公司于1984年推出的一套高性能的数值计算和数据可视化数学软件。
20世纪70年代,Cleve Moler和他的同事在美国国家自然科学基金的资助下研发了调用LINPACK和EISPACK的FORTRAN子程序库,这两个程序库是用于解线性方程和矩阵特征值问题的,代表着当时矩阵计算软件的最高水平。后来Cleve Moler在新墨西哥大学给学生开线性代数课程时,用业余时间为学生编写使用方便的LINPACK和EISPACK的接口程序,并给这个接口程序取名为MATLAB。Cleve Moler先后到多所大学讲学,MATLAB逐渐为人们所接受并成为应用数学界的术语。
当Cleve Moler 1983年到斯坦福大学访问时,工程师John Little就意识到MATLAB将会在工程计算领域里大有作为,于是他与Moler及Steve Bangert等人一起合作开发了第二代专业版MATLAB。从这一代开始,MATLAB的核心就采用C语言编写,并且MATLAB除了具有数值计算的功能以外,还具备了数据可视化的功能。
1984年,Mathworks公司成立,把MATLAB推向了市场,并继续MATLAB的研制和开发。1993年,MATLAB的第一个Windows版本问世,同年,支持Windows 3.x的MATLAB 4.0版本推出。4.0版本做了很大的改进,如增加了Simulink,Control, Neural Network,Optimization,Signal Processing,Spline,State-space Identification,Robust Control,Mu-analysis and synthesis等工具箱。1993年11月,Mathworks公司又推出了MATLAB 4.1版本,首次开发了Symbolic Math符号运算工具箱,其升级版本MATLAB 4.2c在用户中得到广泛的应用。
1997年,MATLAB 5.0版本问世了。相对于MATLAB 4.x版本,它是真正的32位运算,功能强大,数值计算加快,图形表现有效,编程简洁直观,用户界面十分友好。
2000年下半年,Mathworks公司推出了MATLAB 6.0(R12)的试用版,2001年初推出了正式版。2002年7月又推出了他们的最新产品MATLAB 6.5(R13),Simulink升级到5.0版本。MATLAB 6.5提供了JIT程序执行加速器,大大提高了程序的执行速度。
本教程主要以MATLAB 6.5为蓝本,简明介绍MATLAB语言的数值计算功能、绘图功能和在数值计算方法中的应用等内容。
5
1.3 MATLAB软件的组成
MATLAB软件是一个大家庭,有许多成员,包括应用程序开发工具、工具箱(Toolbox)、数据存取工具、模块集、状态流图、代码生成工具、学生产品等。
应用程序开发工具包括MATLAB编译器、C/C++数学库、MATLAB运行服务器、MATLAB Web服务器,这些工具可以建立和发布独立于MATLAB环境的应用程序(需要编译)。
工具箱实际上是一些高度优化并且是面向专门应用领域的一系列MATLAB函数(称为M文件)的集合,它可用来求解各类学科的问题。仅随软件提供的工具箱可支持的领域就有信号处理、图像处理、控制系统设计、最优化、金融工程、符号数学、神经网络、系统辩识等等。工具箱的最大的特点是它的开放性,几乎所有函数都是用MATLAB语言写成的(只有少数工具箱的某些函数是使用C语言写成的动态库函数),因而可以直接阅读和加以改写,用户也可以自行开发适合特定领域的工具箱。
数据存取工具提供了从外部数据源获取数据的简易途径,这些数据源包括外部硬件和外部数据库(与JDBC、ODBC兼容)。为了方便数据的读取,MATLAB 6.x提供了数据编辑器,以完成从MATLAB外部便捷地读取数据的功能;通过该编辑器可以实现多种数据类型的转换。
模块集是面向应用领域的模块(Simulink的基本单位)的集合,这些模块可以直接用于Simulink模型中,在命令窗口(matlab command window)键入“simulink”,就出现(SIMULINK) 窗口,以往十分困难的系统仿真问题,用SIMULINK只需拖动鼠标即可轻而易举地解决问题。状态流图是一个专门针对事件驱动系统建模和设计的图形化的模拟环境。代码生成工具可以从Simulink模型或状态流图中产生可定制的C和Ada代码,以便实现快速原型和硬件在线模拟。
学生产品是专门针对美国和加拿大地区的学生而发布的MATLAB的简易和廉价版本。
1.4 MATLAB软件的安装
6
1.4.1 运行MATLAB的基本要求
1. MATLAB 6.5对硬件的要求
·CPU 奔腾、奔腾Pro、奔腾二、三或四代、AMD Athlon或者更高; ·光驱 至少为24速光驱;
·内存 至少128MB,推荐256MB以上;
·硬盘 至少预留260MB的硬盘空间(根据需要安装的东西所定); ·显卡 256色以上。
2. MATLAB 6.5对软件的要求
· Microsoft Windows Me/98/NT/2000/XP;
· Microsoft Word 97/2000/XP,用以使用MATLAB Notebook;
· Compaq Visual Fortran 5.0,Microsoft VC/C++5.0,Borland C/
C++5.0,
Borland C++;
· Builder version 3.0或更高版本,用以实现API; · Adobe Acrobat Reader,用以阅读MATLAB的PDF帮助信息。
可见,MATLAB 6.5对内存的要求加大,并且不再支持Windows 95系统,不再支持Office95。根据Mathworks公司的报告,在即将发行的新版本的产品中将不再支持Windows 98系统。读者可以根据自己的需求来合理选择需要安装的版本。
1.4.2 安装MATLAB
将MATLAB 6.5的安装盘放入光驱,系统会自动搜索到autorun文件并进入安装界面。安装步骤十分简便,按提示进行操作就可以了。当用户填写注册信息及接受使用协议后,将进入MATLAB的选择安装界面,如图1.1所示。用户可以根据使用的要求有选择地安装各组件和安装目录。
完全安装MATLAB 6.5需要1.5GB以上的硬盘空间,对一般的计算机用户来说,许多工具箱软件包可能在相当长的时间内根本用不到,因此选择安装就显得很重要。表1.1列出了供选择的各个选项的具体解释。对于初学者,安装表中粗体内容即可,大约需要250MB的硬盘空间。对于硬盘很大的用户,最好需要什么才安装什么,并不是安装
7
得越多越好。
图1.1
选好需要安装的组件和安装目录后就可以进行安装了。在安装之后再重新启动计算机,安装时所做的一些设置,如搜索路径设置等才会生效。
表1.1 可以选择安装的项目
组件选项 MATLAB Simulink CDMA Reference Blockset Communications Blockset Communications Toolbox Control System Toolbox DSP Blockset Data Acquismon Toolbox Database Toolbox Datafeed Tookbox Dials and Gauges Blockset Excel Link Filter Design Toolbox Financial Derivatives Toolbox 功能解释 MATLAB主程序 动态仿真 CDMA参考模块集 通信模块集 通信工具箱 控制系统工具箱 数字信号模块集 数据采集工具箱 数据库工具箱 数据流入工具箱 刻度标尺模块集 外链接 滤波器设计工具箱 金融系统工具箱 组件选项 Financial Toolbox Fixed-Point Blockset Fuzzy Logic Toolbox GARCH Toolbox Image Processing Toolbox Instrument Control Toolbox LMI Control Toolbox MATLAB C/C++ Graphics Library MATLAB C/C++ Math Library MATLAB Compiler MATLAB Report Generator Mapping Toolbox 功能解释 金融财政工具箱 定点模块集 模糊逻辑工具箱 GARCH工具箱 图像处理工具箱 器材控制工具箱 LMI控制工具箱 MATLAB C/C++图形库 MATLAB C/C++数学计算库 MATLAB编译器 MATLAB报告生成器 制图工具箱 Model Predictive Control 模型预测控制工具箱 Toolbox Motorola DSP Developer's 摩托罗拉数字信号处理Kit 开发工具包 8
Financial Time SeriesToolbox Neural Network Toolbox 金融时间系列工具箱 神经网络工具箱 Mu-Analysis and Synthesis Mu分析与合成工具箱 Toolbox Signal Processing Toolbox Simulink Report Generator Spline Toolbox Stateflow Stateflow Coder Statistics Toolbox Symbolic Math Toolbox System Toolbox Identification 信号处理工具箱 Simulink报表生成器 样条工具箱 状态流工具箱 状态流编码器 统计工具箱 符号运算工具箱 系统识别工具箱 小波工具箱 xPC对象 Embedded xPC对象内置属性 Nonlinear Control Design 非线性设计模块集 Blockset Optimization Toolbox 最优化工具箱 Partial Dfferential 偏微分方程工具箱 Equation Toolbox Power System Blockset Real-Time Workshop 动力系统模块集 实时工作间 Real-Time Workshop Ada 实时工作问Ada编码器 Coder Real-Time Workshop Embedded 实时工作间内置编码器 Coder Requirements Management 需求管理界面 Interface Robust Control Toolbox 鲁棒控制工具箱 SB2SL(converts models to 模型转换成Simulink工Simulink) 具 Wavelet Toolbox xPC Target xPC Target Option 此外,MathWorks公司还提供了从网上进行下载安装的MATLAB6.5学生版的免费软件,免费使用期是一个月。下载网址是:http://www.mathworks.com。
1.5 MATLAB的基本操作
1.5.1 MATLAB的桌面平台
双击系统桌面的MATLAB图标,启动MATLAB,也可以在开始菜单的程序选项中选择MATLAB快捷方式,还可以在MATLAB的安装路径的bin子目录中双击可执行文件matlab.exe。初次启动MATLAB后,将进入MATLAB默认设置的桌面平台,如图1.2所示。
默认情况下的桌面平台包括5个窗口,分别是MATLAB主窗口、命令窗口、历史窗口、当前目录窗口和工作空间窗口。下面分别对各窗口做简单介绍。
1.MATLAB主窗口
MATLAB 6.5的主窗口包含其他的几个窗口。主窗口不能进行任何计算任务的操作,只用来进行一些整体的环境参数的设置。它主要包括6个下拉菜单和10个按钮控件。
9
图1.2
10个按钮控件的功能如下:
新建或打开一个MATLAB文件; 剪切、复制或粘贴已选中的对象; 撤销或恢复上一次操作; 打开Simulink主窗口; 打开MATLAB的帮助系统;
设置当前路径。
6个下拉菜单分别是【File】、【Edit】、【View】、【Web】、【Window】和【Help】。这里只简单介绍与基本操作有关的内容。
单击【File】下拉菜单,点击【Set Path】,会弹出图1.3所示的对话窗口,点击【Add Folder】,浏览文件夹,找到需要运行程序所在的文件夹位置,按【确定】后窗口中就会新添一条用户设置的路径,按【Save】和【Close】,退出对话窗口,以后只要在命令窗口中键入该路径下的MATLAB应用程序,就可以正常运行,不会出现找不到路径的错误了。这是因为MATLAB的一切操作都是在它的搜索路径(包括当前路径)中进行的,如果调用的函数在搜索路径之外,MATLAB则认为此函数并不存在。因此,必须把应用程序所在的目录扩展成MATLAB的搜索路径。
单击【File】下拉菜单,点击【Preferences】,会弹出图1.4所示的对话窗口,10
可以对各窗口的字体、字号、字符颜色、数据显示格式、图形复制等很多属性进行设置。这里不进行介绍详细。
图图1.4
1.3
单击【File】下拉菜单,点击【New】,再点击【M-file】,会弹出文本编辑窗口,用户可以编写自己的MATLAB应用程序(M文件和M函数)。
单击【Edit】下拉菜单,点击【Clear Command Window】,可以清除命令窗口中的所有内容,窗口中只剩下命令提示符“>>”。
单击【View】下拉菜单,点击【Desktop Layout】,再点击【Default】,MATLAB就恢复默认的桌面平台设置。
2.命令窗口
在MATLAB的命令窗口中,“>>”为运算提示符,表示MATLAB正处在准备状态,接受用户的输入指令。当在提示符后输入MATLAB通用命令、MATLAB函数(M函数)、MATLAB应用程序(M文件)和一段MATLAB表达式等,按【Enter】键后,MATLAB将进行系统管理工作以及进行数值计算、给出计算结果,如果指令集中调用了MATLAB绘图命令,将会弹出图形窗口,显示计算结果的数学图形。指令完成之后,MATLAB再次进入准备状态。
在MATLAB的基本函数库(表1.2)中,有MATLAB通用命令和许多其他的MATLAB函数。如果用户一旦发现某个指令不知如何使用时,可以用help命令将该指令紧跟于后,系统便会告诉该指令的意义和使用方法。例如:
>> help sin SIN Sine.
11
SIN(X) is the sine of the elements of X.
表1.2 MATLAB基本函数库
库 内 容 数据分析函数库 动态数据交换库 初等数学函数库 基本矩阵库 时间日期函数库 非线性数值方法库 通用命令库 数据类型库 通用图形函数库 低层输入/出函数库 语言结构函数库 库 名 datafun dde elfun elmat timefun funfun general datatypes graphics iofun lang 库 内 容 矩阵线性代数库 运算符和特殊字符库 二维图形库 特殊图形函数库 三维图形库 多项式和插值函数库 稀疏矩阵函数库 特殊数学函数库 字符串函数库 用户界面工具库 MATLAB演示库 库 名 matfun ops graph2d specgraph graph3d polyfun sparfun specfun strfun Guitools demos 又例如,在MATLAB下进行基本数学运算,只需将运算式直接打入提示号之后,并键入【Enter】键即可。
>> (10*19+2/4-34)/2*3 (Enter) ans = 234.7500
MATLAB会将运算结果直接存入一变量ans,代表MATLAB运算后的答案,并在屏幕上显示其数值。
MATLAB可以将计算结果以不同的精确度的数字格式显示,单击主窗口的菜单【File】,点击【Preferences】,弹出窗口后,再点击Command Window,在Numerical Format下拉选项框中,选中“format short”,这就是系统默认的数据格式。
如果在上例中数学运算式的结尾加上“;”,则计算结果不会显示在命令窗口上,要得知计算值只须键入表示这一数学运算式的变量名即可。例如:
>> a=(10*19+2/4-34)/2*3; a= 234.7500 12
(Enter)
3.命令历史窗口
在默认设置下,历史窗口中会保留自安装起所有命令的历史记录,并标明使用时间,这方便了使用者的查询。双击某一行命令,即在命令窗口中执行该行命令。
4.当前目录窗口
在当前目录窗口中可显示或改变当前目录,还可以显示当前目录下的文件并提供搜索功能。在此窗口中,显示并改变当前目录的控件,与主窗口中的路径显示控件完全相同。
5.工作空间窗口
工作空间窗口是MATLAB的重要组成部分。在工作空间窗口中将显示目前内存中所有的MATLAB变量的变量名、数据结构、字节数以及类型,不同的变量类型分别对应不同的变量名图标。
工作空间窗口的工具栏由5个部分组成,他们是4个按钮控件和1个下拉菜单。
保存工作空间中的所有数据; 打开已保存的MATLAB数据文件; 打开所选数据的矩阵编辑器; 删除所选数据;
MATLAB在执行M文件时,将把该M文件的数据保存到其对
应的工作空间中。为了区别,命令窗口的工作空间(也包括全局变量的工作空间)被标记为基本工作空间(Base)。因此,此控件用于调试M文件时实现不同工作空间之间的切换。
1.5.2 MATLAB的使用技巧
1. MATLAB的通用命令
使用MATLAB之前,应该熟悉一些常用的MATLAB通用命令,通用命令用于对MATLAB系统的管理。表1.3给出了MATLAB通用命令库中的部分命令。
表1.3 通用命令表
13
命 令 cd dir type clear clf pack clc echo help helpwin lookfor demo readme who whos 命令说明 显示或改变工作目录 显示目录下文件 显示文件内容 清理内存变量 清除图形窗口 收集内存碎片,扩大内存空间 清除工作窗 工作窗信息显示开关 在线帮助 在线帮助窗口 在HELP里搜索关键字 运行演示程序 显示Readme文件 显示当前变量 显示当前变量的详细信息 命 令 hold disp path save load diary 命令说明 图形保持开关 显示变量或文字内容 显示搜索目录 保存内存变量到指定文件 加载指定文件中的变量 日志文件命令 quit/exit 退出MATLAB ! dos unix what which path ver pwd computer 调用操作系统命令 执行dos命令 执行unix命令 显示指定的matlab文件 定位函数或文件 获取或设置搜索路径 版本信息 显示当前的工作目录 显示计算机类型 helpdesk 在线帮助工作台 例如,当要暂时离开MATLAB,去执行操作系统(例如Dos)的指令而后还要再进入MATLAB时,则可以利用惊叹号“!”加上想要执行的操作系统的指令,如!dir等。
又例如,要结束MATLAB的运行,可以采用下列三种方法之一: 键入quit命令; 键入exit命令;
直接关闭MATLAB的命令窗口(Command window)。
2. 一些常用操作技巧
在MATLAB的使用过程中,通过使用常用键盘按键技巧可以使命令窗口的行操作变得简单容易。
表1.4 常用操作键
键盘按键 ↑ ↓ ← → 说 明 Ctrl+p,调用上一行 Ctrl+n,调用下一行 键盘按键 home end 说 明 Ctrl+a,光标置于当前行开头 Ctrl+e,光标置于当前行末尾 Ctrl+u,清除当前输入行 Ctrl+d,删除光标处的字符 Ctrl+b,光标左移一个字符 esc Ctrl+f,光标右移一个字符 del 14
Ctrl+← Ctrl+→ Ctrl+l,光标左移一个单词 backspace Ctrl+h,删除光标前的字符 Ctrl+r,光标右移一个单词 Alt+backspace 恢复上一次删除 例如,MATLAB利用了↑↓二个游标键,可以将所用过的指令叫回来重复使用。按下↑则前一次指令重新出现,之后再按Enter键,即再执行前一次的指令。而↓键的功用则是往后执行指令。其它在键盘上的几个键,如→、←、Delete、Insert,其功能则显而易见,无须多加说明。
另外,Ctrl-C(即同时按Ctrl及C两个键)可以用来中止执行中的MATLAB程序。 3. 标点
在MATLAB语言中,一些标点(表1.5)被赋予特殊的意义或代表一定的运算,他们被MATLAB变量和语句所应用,例如“:”和“,”在矩阵和语句中有不同的含义。
表1.5 运算符和特殊字符库
标 点 : ; , ( ) [ ] { } 定 义 冒号,具有多种应用功能 分号,区分行及取消运行显示等 逗号,区分列及函数参数分隔符等 括号,指定运算过程中的先后次序等 方括号,矩阵定义的标志等 大括号,用于构成单元数组等
标 点 . „ % ! = ' 定 义 小数点,小数点及域访问符等 续行符 百分号,注释标记 惊叹号,调用操作系统运算 等号,赋值标记 单引号,字符串的标示符等 1.5.3 MATLAB的帮助系统
MATLAB的帮助系统大致可分为联机帮助系统、命令窗口查询帮助系统和联机演示系统三大类,用户在学习MATLAB的过程中,理解、掌握和熟练运用这些帮助是非常重要的。下面主要对命令窗口查询帮助系统进行介绍。
命令窗口查询帮助主要可以分为help系列、lookfor命令和其他常用帮助命令。
1.help系列
help系列的帮助命令有help,help+函数(类)名,helpwin及helpdesk,其中后两
15
者是用来调用联机帮助窗口的。 (1) help
help命令是最为常用的命令。在命令窗口中直接输入help命令将会显示当前的帮助系统中所包含的所有项目,即搜索路径中所有的目录名称。 (2) help+函数(类)名
在实际应用中,这是最有用的一个帮助命令,可以辅助用户进行深入的学习。 【例1.1】>> help log
LOG Natural logarithm.
LOG(X) is the natural logarithm of the elements of X. Complex results are produced if X is not positive. See also LOG2, LOG10, EXP, LOGM.
2.lookfor函数
当知道某函数的函数名而不知其用法时,help命令可帮助用户准确地了解此函数的用法。然而,若要查找一个不知其确切名称的函数名时,可以用lookfor命令来查询根据用户提供的关键字搜索到的相关函数。 【例1.2】>> lookfor Euler
RIGIDODE Euler equations of a rigid body without external forces. EULER Simulink 1.x EULER integration algorithm. BWEULER Compute the Euler number of binary image.
eulerfs.m: % function [ttab,xtab]=eulerfs(plant,t,x0,u0,h,p1,p2,p3,p4,p5)
lookfor的查询机理为:它对MATLAB搜索路径中的每个M文件的注释区的第一行进行扫描,一旦发现此行中含有所查询的字符串,则将该函数名及第一行注释全部显示在屏幕上。由此机理,用户也可在自己的文件中加入在线注释。
3.其他帮助命令
MATLAB中还有一些可能会常用到的查询、帮助命令,如下所示。
exist what
16
变量检验函数 目录中文件列表
who 内存变量列表 whos which
内存变量详细信息 确定文件位置
17
二 MATLAB变量与表达式
2.1 MATLAB的变量
2.1.1 数据类型
数据是计算机程序处理的对象。数据可能是整数、实数、复数、数值矩阵或者是字符、字符串等,他们占用的计算机内存大小显然是不同的。为了数据存储和处理的需要,编译程序将数据划分成不同的类型,并规定了每一种类型数据在内存的存储单元字节数和对该类型数据所能进行的运算。
然而,在MATLAB程序语言中,数据的类型是相同的,对用户而言只有一种。 MATLAB是一种面向矩阵的编程语言,它将任何数据都看成是矩阵:一个实数是虚部为零的复数,一个复数是1×1的数值矩阵;数量、向量和字符串等是特殊的矩阵;一个N×M的数据矩阵由N×M个复数元素构成。矩阵的类型可以是复数型矩阵、实数型矩阵或由字符组成的字符型矩阵。
在MATLAB中,所有数据都是以阵列的形式存在的,该阵列称为MATLAB Arrays。在C语言的意义下,变量类型mxArray定义MATLAB阵列的内部数据结构,即任何一个MATLAB变量定义为C语言意义下的mxArray结构类型。mxArray结构包含以下的结构域:
MATLAB变量名Name—这是指向一个字符串的指针,该字符串就是MATLAB的变量名字。 变量的维数Dimensions—定义各维数大小。例如数量、向量和矩阵都被视为二维的。
变量的类型ClassName—这是一个标识值,指明变量被显示时是数值变量还是字符型变量,即将
变量元素看成是字符的ASCII码。
变量的实或复数类型——如果变量包含有复数值作为其元素,那么该变量对应的MATLAB内部阵列
就包含有实部向量和虚部向量。
变量的存储属性Storage—即是否是稀疏矩阵。指明变量的存储类型,即变量是按全元素矩阵还
是按稀疏矩阵的方式存储。它的取值是Full或Sparse。
在MATLAB系统中,矩阵有两种不同的存储类型,即全元素矩阵的存储方式或稀疏矩阵的存储方式等。如果MATLAB变量是全元素矩阵,那么mxArray阵列结构类型包含有参数pr和pi,pr是指向实部向量的指针,pi是指向虚部向量的指针。如果MATLAB18
变量是稀疏矩阵,则mxArray除了有pr和pi参数外,还有nzmax、ir和jc三个参数。
1. 复双精度矩阵(Complex Double-Precision Matrices)
这是最常用到的非稀疏矩阵数据形式。其大小(size)是N×M,N是矩阵的行(rows),M是矩阵的列(columns)。矩阵各数据元素存放在两个双精度(64位)向量(即内存单元)中,一个存放实部数据(指针pr指向它),另一个存放虚部数据(指针pi指向它)。如果是实数,则复双精度矩阵中pi为空(NULL)。 2. 数值矩阵(Numeric Matrices)
包括单精度数、浮点数和8-bits、16-bits、32-bits带符号和不带符号的整数。其数据的存储形式同复双精度矩阵一样,也是两个阵列。 3. MATLAB字符串(Strings)
字符串是字符(char)类数据,其存储形式与16-bits的整数一样,只是没有虚部数据。每个字符都是16-bits的ASCII码。 4. 稀疏矩阵(Sparse Matrices )
在MATLAB中,对于稀疏矩阵有特别的格式规定,除了复双精度矩阵的实部和虚部向量的两个参数pr与pi之外,还有nzmax, ir, 和 jc三个参数。
参数nzmax、ir和jc的具体含义如下:
nzmax-nzmax是个整型数,其值为向量pr和pi(如果存在)可能的最大长度。它是稀疏矩阵中
不为零的元素的个数。
pr――指向长度为nzmax的双精度型向量的指针,该向量按列由稀疏矩阵中“非零”元素的实部
构成。
pi――指向长度为nzmax的双精度型向量的指针,该向量按列由稀疏矩阵中“非零”元素的虚部
构成。如果指针为NULL,表示是实数型矩阵。
ir――指向一个长度为nzmax的整型数阵列,该阵列包含pr和pi中对应元素的行号。
jc――指向一个长度为N+1的整型数阵列(N为矩阵的列数),其中包含的是列号信息。对于任
意的列号j,如果0≤ j≤ N-1,jc[ j ]是第j列中第一个非零项在pr及pi(如果存在)中的序号;jc[j+1]-1是第j列最后一个非零项的序号。jc[N]定义为原矩阵变量中“非零”元素的总数nnz。如果nnz小于nzmax,可以继续向矩阵中添加非零项,而无须分配额外的存储空间。
由此可见,在MATLAB中,矩阵的各种数据类型在语法上是完全相同的。因此,用MATLAB语言编程十分简洁。
MATLAB实现变量数据类型的统一,在很大程度上简化了程序设计。用户不需要事先
19
声明、指定所使用变量的类型、定义变量的维数,MATLAB会自动根据所赋予变量的值或对变量所进行的操作来确定变量的类型和维数;在赋值过程中,如果变量已存在,MATLAB语言将使用新值代替旧值,并以新的变量类型和维数代替旧的变量类型和维数。
2.1.2 变量类型
在MATLAB中,简单变量就是1×1的矩阵变量,向量就是n×1或1×m的矩阵变量,简单变量、向量和矩阵变量在类型上也是统一的。因此,MATLAB的基本变量就是矩阵型变量。在下面的内容中,如果不需要特别区分,约定变量就是指矩阵变量(含1×1矩阵变量),常量就是指矩阵常量(含1×1矩阵常量)。
在现实中,常常需要分层次地把一些不同类型、不同尺寸和不同分层的数据组织起来,成为一个复杂变量。在MATLAB中,是用单元型变量和结构型变量将不同类型数据组合在一起的(结构型变量用指针来传递数据,单元型变量不用指针来传递数据)。因此,在MATLAB中,变量类型有矩阵型变量、单元型变量和结构型变量三种,但后两种类型的变量在数据类型上仍然和矩阵型变量相同。下面用具体例子来说明。 【例2.1】结构型变量的赋值。把学生的姓名、出生日期和成绩组织在一起。
>>
student.name='sam';
student.birthday='1988.08.08';
student.score=[90,90,95];
>> student student =
%结构型变量,有3个属性值。
name: 'sam' birthday: '1988.08.08' score: [90 90 95]
>> stdnt=struct('name','sam','birthday','1988.08.08','score',[85,90,95]) stdnt =
%第二种赋值方法。
name: 'sam' birthday: '1988.08.08' score: [85 90 95]
【例2.2】单元型变量的赋值。把学生的姓名、出生日期和成绩组织在一起。
>> STUDENT={'SAM','1988.08.08',[85,90,95]} STUDENT = 20
'SAM' '1988.08.08' [1x3 double] >> STDNT=cell(1,3) STDNT =
[] [] []
>> STDNT{1,1}='SAM';STDNT{1,2}='1988.08.08';STDNT{1,3}=[85,90,95]; >> STDNT STDNT =
'SAM' '1988.08.08' [1x3 double] >> STDNT{3} ans =
85 90 95
%第二种赋值方法。
2.1.3 存储形式
MATLAB矩阵数据都是以列(column)为先的阵列形式存储的,如同Fortran语言的规则一样。例如,给出一个字符串矩阵:
a=['house'; 'floor'; 'porch']
a =
house f loor porch size(a) ans =35
它的大小是
它在内存单元中的存储顺序是: h
f p o l o u o r s o c e r h 2.1.4 变量命名规则
在MATLAB语言中,变量的命名遵守如下规则:
(1)变量名以英文字母开头(即第一个字符必须为英文字母),变量名中可包含字母、数字和下划线“_”,但不能包含空格符和其它标点符号。
21
例如, V_31为合法变量名,但V-31,V 31, V=31, V+31,V—31等都不是合法的变量名。
(2)变量名中的字母区分大小写。
例如,单一字母X 和x 、A和 a是不同的变量名,MAT_LAB、MAT_lab和mat_lab等是完全不同的变量名。
(3)变量名长度不能超过31个字符(第31个字符之后的字符将被忽略)。
例如,V31为合法变量名。
需要说明的是,MATLAB语言与其他的程序设计语言一样,也存在变量作用域的问题。在未加特殊说明的情况下,MATLAB语言将所识别的一切变量视为局部变量,即仅在其调用的函数内有效。若要定义全局变量,应对变量进行声明,即在该变量前加关键字global。一般来说,全局变量习惯用大写的英文字符表示,以便记忆和理解。
2.1.5 MATLAB预定义的变量
MATLAB有一些预定义的变量,表2.1给出了MATLAB语言中经常使用的一些预定义的变量及其说明。
表 2.1 MATLAB预先定义的变量
变 量 ans eps pi inf NaN i 或 j realmax realmin nargin nargout flops 含 义 预设的计算结果的变量名 MATLAB定义的正的极小值2.2204e-16 内建的π值 ∞值,无限大 ( 1/0) 无法定义的一个数 (0/0) 虚数单位i = j = 1 最大的正实数1.7977e+308 最小的正实数2.2251e-308 函数输入参数的个数 函数输出参数的个数 浮点运算次数
2.2 MATLAB的表达式
22
2.2.1 表达式
MATLAB数值计算语句是由表达式和变量等组成(即MATLAB是表达式语言),用户输入的语句由MATLAB系统直接解释运行,因此,变量和表达式是使用MATLAB进行数值计算的基础。MATLAB语句有2种最常见的形式:
表达式 变量=表达式
表达式由运算符、函数、变量和数字组成。MATLAB书写表达式的规则与“手写算式”几乎完全相同。表达式在MATLAB中占有很重要的地位,几乎所有的数值计算都必须借助它来进行。
在第一种形式中,表达式运算后产生的结果由MATLAB系统自动赋给名为ans的变量,并显示在屏幕上。ans是一个默认的预定义变量名,它会在以后的类似操作中被自动覆盖掉。所以,对于在后续的计算中将要用到的重要结果,一定要记录下来,应该使用第二种形式的语句(赋值语句)。
在第二种形式中,等号右边的表达式计算后产生的结果由MATLAB系统将其赋给等号左边的变量后放入内存中,并显示在屏幕上。 【例2.3】
>> 2*sin(pi/4)+3.^2-sqrt(9) ans = 7.4142
>> w=2*sin(pi/4)+3.^2-sqrt(9) w = 7.4142
注意:
(1)在书写表达式时,运算符两侧允许有空格,以增加可读性。表达式的末尾可以加上“;”,也可以不加。
(2)如果一个指令过长可以在结尾加上省略号“...”(代表此行指令与下一行连续),剩余部分在下一行继续写完。例如
>> S=3*... 6+5 S = 23
23
(3)MATLAB常用算符
+ 加法、- 减法 、^ 幂、 * 乘法、 / 右除 、 \ 左除
在矩阵运算中有左除和右除的区别,对于数字运算则没有区别。
2.2.2 数据的输出格式
在MATLAB语言中的数值有多种显示形式。在默认情况下,若数据为整数,则以整型表示;若为实数,则以保留小数点后4位的浮点型表示。
在MATLAB系统中数据的储存和计算都是以双精度进行的,但是用户可以改变数据在屏幕上显示的格式,即可以用format命令控制MATLAB的输出格式。应该注意,format命令只影响数据在屏幕上的显示结果,而不会影响数据在MATLAB内的存储和运算。具体应用方法如表2.2所示。
表2.2 数据输出格式
formatshort /format 5位定点表示。 例如 1.4142 15位定点表示。例如 1.41421356237310 5位浮点表示。 例如 1.4142e+000 15位浮点表示。例如 1.414213562373095e+000 系统选择5位定点和5位浮点中更好的表示 系统选择15位定点和15位浮点中更好的表示 近似的有理数的表示。例如 sqrt(2)=1393/985 十六进制的表示。 例如 3ff6a09e667f3bcd 表示大矩阵是分别用+、-和空格表示矩阵中的正数、负数和零。 用元、角、分(美制)定点表示。例如 1.41 变量之间没有空行。 变量之间有空行。 format long format short e format long e format short g format long g format rational format hex format +(plus) format bank format compact format loose
另外,MATLAB提供在对话框中选择显示格式,这在概述中已经介绍过了。
2.2.3 MATLAB常用数学函数
在MATLAB中,常用的数学函数包括三角函数和双曲函数、指数函数、复数函数、归整函数和求余函数、矩阵变换函数和其他函数。具体函数名称和含义见表2.3-表2.8。
表2.3 三角函数和双曲函数(弧度) 名 称 sin 含 义 正弦 名 称 csc 含 义 余割 名 称 atanh 含 义 反双曲正切 24
cos tan cot asin acos atan acot sec 余弦 正切 余切 反正弦 反余弦 反正切 反余切 正割 asec acsc sinh cosh tanh coth asinh acosh 反正割 反余割 双曲正弦 双曲余弦 双曲正切 双曲余切 反双曲正弦 反双曲余弦 acoth sech csch asech acsch atan2 反双曲余切 双曲正割 双曲余割 反双曲正割 反双曲余割 四象限反正切 表2.4 指数函数
名 称 exp log 含 义 e为底的指数 自然对数 名 称 log10 log2 含 义 10为底的对数 2为底的对数 名 称 pow2 sqrt 含 义 2的幂 平方根 表2.5 复数函数
名 称 abs angle 含 义 绝对值 相角 名 称 conj imag 含 义 复数共轭 复数虚部 名 称 real 含 义 复数实部 表2.6 归整函数和求余函数
名 称 ceil fix floor mod 含 义 向+∞归整 向0归整 向-∞归整 模除求余 名 称 rem round sign 含 义 求余数 向靠近整数归整 符号函数 表2.7 矩阵变换函数
名 称 fiplr fipud fipdim rot90 含 义 矩阵左右翻转 矩阵上下翻转 矩阵特定维翻转 矩阵反时针90翻转 o名 称 diag tril triu 含 义 产生或提取对角阵 产生下三角 产生上三角 表2.8 其他函数
名 称 min 含 义 最小值 名 称 max 含 义 最大值 25
mean std sort norm prod cumsum cross 平均值 标准差 排序 欧氏(Euclidean)长度 总乘积 累计元素总和 外积 median diff length sum dot cumprod 中位数 相邻元素的差 个数 总和 内积 累计元素总乘积
26
三 MATLAB矩阵及运算
3.1 MATLAB矩阵的生成和修改
3.1.1 矩阵的生成
1. 直接输入数据
当需要输入的矩阵维数比较小时,可以直接输入数据建立矩阵。矩阵数据(或矩阵元素)的输入格式如下:
(1)输入矩阵时要以“[ ]”作为首尾符号,矩阵的数据应放在 “[ ]”内部,此时MATLAB才能将其识别为矩阵;
(2)要逐行输入矩阵的数据,同行数据之间可由空格或“,”分隔,行与行之间可用“;”或回车符分隔;
(3)矩阵数据可为运算表达式; (4)矩阵大小可不预先定义;
(5)如果不想显示输入的矩阵(作为中间结果),可以在矩阵输入完成后以“;”结束;
(6)无任何元素的空矩阵也合法。
【例3.1】 a=[1 2 5] 和 a=[1,2,5] 为同一矩阵;
b=[3;2;5] 和 b=[3
2
5] 为同一矩阵。 【例3.2】 建立矩阵并显示结果。
>> X=[1,2,3;4,5,6;7,8,3*3] X =
1 2 3
27
4 5 6 7 8 9
2. 由矩阵编辑器生成
MATLAB提供了一个矩阵编辑器,用户可以用来创建和修改比较大的矩阵。在使用矩阵编辑器之前,需要预先定义一个变量(任意的),如图2.1所示的3×3矩阵X。接下来,按下列步骤进行操作:
(1)选中所定义的变量,打开矩阵编辑器,如图3.1所示;
(2)将文本框size中的数据3 by 3改变成欲生成矩阵的行数和列数,回车后就能看到窗口中矩阵的维数立刻发生改变;
图 3.1
(3)在窗口中矩阵元素的位置上输入或修改数据,回车后自动提示输入下一行矩阵元素的数据,矩阵元素的输入顺序是按列自动进行的;
图 3.2
(4)输入完成后,关闭编辑器,变量X就定义保存好了。 28
3. 由函数自动生成
MATLAB提供了一些生成矩阵的函数,用户可以方便地用他们建立自己所需要的矩阵。
(1)向量、行矩阵、列矩阵的自动生成
用“起始值:增量值:终止值”的格式自动生成等差数列。 【例3.3】>> x=(1:1:10) 可表示成
x =
1 2 3 4 5 6 7 8 9 10 >> x=1:1:10 x =
1 2 3 4 5 6 7 8 9 10 >> I=1:15 I =
1 2 3 4 5 6 7 8 9 10 11
% “起始值:终止值”,即 x=(1:10) 或 x=1:10。
% 表示“起始值:增量值:终止值”,增量为1时
12 13 14 15
用“linspace(起始值:终止值:元素数目)”的格式自动生成等差数列;用“logspace(起始值:终止值:元素数目)”的格式自动生成对数等分数列。 【例3.4】>> y=linspace(30,50,11)
y =
30 32 34 36 38 40 42 44 46 48 50 列矩阵的生成格式如下: 【例3.5】>> x=(1:1:10)';
>> y=linspace(90,95,6)' y = 90 91 92
29
93 94 95
(2)其它矩阵的自动生成
MATLAB提供了许多特殊矩阵的生成函数,如零矩阵zeros(m,n),全部元素为的矩阵ones(m,n),单位矩阵eye(n),随机矩阵rand(m,n)和魔方矩阵magic(n)等,利用这些矩阵可以生成所需要的矩阵。 【例3.6】 特殊矩阵的生成。
>> a=[] a =
% 定义空矩阵,即0×0矩阵。
[]
>>zeros(2,2); % 定义全为0的矩阵(2 2的阵列)。 >>ones(3,3); % 定义全为1的矩阵(3 3的阵列)。 >>rand(2,6) % 定义随机矩阵(2 6的矩阵)。 ans =
0.2259 0.7604 0.6405 0.3798 0.6808 0.5678 0.5798 0.5298 0.2091 0.7833 0.4611 0.7942 >> rand(2,6) % 第二次运行结果。 ans =
0.9501 0.6068 0.8913 0.4565 0.8214 0.6154 0.2311 0.4860 0.7621 0.0185 0.4447 0.7919
30
>> magic(4) ans =
16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1
3.1.2 矩阵的修改
1. 矩阵元素的修改
欲修改矩阵中某个元素的数值,应该先确定该元素的位置,再用赋值语句来实现。根据矩阵的行列数和元素在矩阵中的存储顺序,可以确定出欲修改元素的位置。 【例3.7】 根据元素在矩阵中的存储顺序来确定矩阵元素的位置,再对元素的数值进行修改。
>>a = [1 2 3 4 5 6 7 8];
% 定义一维1x8 阵列,表示了8个元素,每个
向量由
%一个分量构成。
>>x= [1 2 3 4 5 6 7 8; 4 5 6 7 8 9 10 11];
% 定义2×8 矩阵,以分号“ ; ”隔离
各列元素,该矩阵表
%示了每个向量由2个分量构成的8个向量的多维空间
% 找出 x的第三个元素,即该矩阵的元素
>> x(3) (1,2)。
ans = 2
>> x([1 2 5]) 阵中的元
ans =
1 4 3 >> x(1:5) ans =
% 找出x的第一、二、五个元素,即2 ×8矩
%素(1,1)、(2,1)和(1,3)。
% 找出 x的前五个元素即第1个到第五个元素。
1 4 2 5 3 >> x(10:end) ans =
8 6 9 7 10 8 11
31
% x的第十个元素后的元素,包括第10个元素。
>> x(10:-1:2) 隔
ans =
% x的第十个元素和第二个元素的倒排。括号中用“:”
%开的3个参数的含义是:第一个参数表示起始的元素 %序号,第二个参数表示递增或递减(-)的元素数,第 %三个参数表示终止元素序号。
8 5 7 4 6 3 5 2 4
>> x(find(x>=10)) % 找出在x大于等于10的元素,也表达为x(x>=10)。 ans = 10 11 >>
>>x(4) = 100 x =
1 2 3 4 5 6 7 8 4 100 6 7 8 9 10 11 >> x(3) = [ ] 阵。
x =
1 4 100 3 6 4 7 5 8 6 9 7 10 8 11
>> x(16) = 99 x =
1 4 100 3 6 4 7 5 8 6 9 7 10 8 11 99
在MATLAB的内部数据结构中,每一个矩阵都是一个以纵列为主(Column-oriented)的阵列(Array)因此,对于矩阵元素的存取,我们可用一维或二维的索引(Index)来定址。
【例3.8】 根据矩阵行列数来确定矩阵元素的位置,再对元素的数值进行修改。 32
>> z=rand(2,5)
% 添加一个元素(加入第十六个元素)。
% 删除第三个元素,注意矩阵变成了1×15矩
% 给x的第四个元素重新赋值
z =
0.6299 0.5751 0.0439 0.3127 0.3840 0.3705 0.4514 0.0272 0.0129 0.6831 >> z(2,3) ans = 0.0272 >> z(2,3)=0 z =
0.6299 0.5751 0.0439 0.3127 0.3840 0.3705 0.4514 0 0.0129 0.6831
2. 矩阵行列的修改
A(m,n)表示矩阵第m行第n列的元素,中间有“,”将行和列分开。若要同时表示更多的矩阵元素,可以采用下列表示方法:
A(I,:) A(:,J)
表示矩阵A第I行全部的元素; 表示矩阵A第J列全部的元素;
表示矩阵A第1行、第3行与第2列、第4列交叉处的元素; 表示矩阵A第1行到第3行与第2列到第4列交叉处的元素, 也可以写成另外两种形式: A((1:3),(2:4)) 和
A([1,3],[2,4]) A([1:3],[2:4]) A(1:3,2:4) 。
有了矩阵多个元素的表示方法,就可以方便地进行矩阵行和列的修改。 【例3.9】 矩阵行列的修改。
>> a=rand(4,5) a =
0.0928 0.0158 0.0576 0.6927 0.3533 0.0353 0.0164 0.3676 0.0841 0.1536 0.6124 0.1901 0.6315 0.4544 0.6756 0.6085 0.5869 0.7176 0.4418 0.6992 >> a(2,:)
33
ans =
0.0353 0.0164 0.3676 0.0841 0.1536 >> a([1:3],[2:4])=0 a =
0.0928 0 0 0 0.3533 0.0353 0 0 0 0.1536 0.6124 0 0 0 0.6756 0.6085 0.5869 0.7176 0.4418 0.6992 >> a([1,3],[2,4])=1 a =
0.0928 1.0000 0 1.0000 0.3533 0.0353 0 0 0 0.1536 0.6124 1.0000 0 1.0000 0.6756 0.6085 0.5869 0.7176 0.4418 0.6992 >> a(4,:)=[ ] a =
0.0928 1.0000 0 1.0000 0.3533 0.0353 0 0 0 0.1536 0.6124 1.0000 0 1.0000 0.6756 >> a(:,6)=[10;20;30] % 增加一列元素(第6列)。 a =
0.0928 1.0000 0 1.0000 0.3533 10.0000
0.0353 0 0 0 0.1536 20.0000
0.6124 1.0000 0 1.0000 0.6756 30.0000
3. 子矩阵
可以由一个矩阵抽取生成一个子矩阵,或者由几个子矩阵组合生成一个新矩阵。 【例3.10】 矩阵抽取生成子矩阵,子矩阵组合生成新矩阵。
>> a=rand(2,3) 34
% 删除一行元素(第4行)。
a =
0.8928 0.2548 0.2324 0.2731 0.8656 0.8049 >> b=ones(2,5) b =
1 1 1 1 1 1 1 1 1 1 >> c=magic(5) c =
17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 >> x=[a, b] x =
0.8928 0.2548 0.2324 1.0000 1.0000 1.0000 1.0000 1.0000
0.2731 0.8656 0.8049 1.0000 1.0000 1.0000 1.0000 1.0000
>> d=c(2,2:4) d =
5 7 14 >> y=[a; d] y =
0.8928 0.2548 0.2324 0.2731 0.8656 0.8049 5.0000 7.0000 14.0000
35
3.2 MATLAB矩阵的保存与提取
在数值计算过程中,经常有大量的矩阵需要保存和再次使用时提取,因此有必要把数据保存于文件中。在MATLAB中可以使用mat文件来保存二进制的数据。具体步骤如下:
(1)保存矩阵。如果A,B矩阵都已存在,用save命令保存,具体格式如下:
save myfilename A B
注意: myfilename是用户自定义的文件名,MATLAB系统会自动地加上后缀mat。系统默认的路径是MATLAB6p5\work。如果用户想要改变路径,可以在文件名前加上路径。 (2)提取矩阵。在重新启动MATLAB后,用load命令可以将保存在文件中的矩阵读到MATLAB工作区的内存中来。
load myfilename
load命令中不指定变量名,系统仍然将A,B作为矩阵的名称来使用。
对矩阵的保存与提取,用户也可以在工作空间窗口中使用保存与打开两个按钮来操作,在概述中已介绍过。
3.3 MATLAB的向量运算
向量就是一维矩阵(行矩阵或列矩阵),并按照矢量运算的规则进行运算。但应注意,在一些场合,向量仅仅是指一维矩阵或矩阵的某一列。本节对向量的基本运算作简单介绍。
3.3.1 加减及与数加减
【例3.11】向量的加减及与数加减。
>> a=[1,3,5,7,9,11],b=[2,4,6,8,10,12] a =
1 3 5 7 9 11 b = 36
2 4 6 8 10 12 >> c=a+b c =
3 7 11 15 19 23 >> d=a-1 d =
0 2 4 6 8 10
3.3.2 数乘
【例3.12】向量的数乘。 a, b向量同上例。
>> 3*b ans =
6 12 18 24 30 36
3.3.3 点积、叉积及混合积
1. 点积计算
在高等数学中,向量的点积是指两个向量在其中某一个向量方向上的投影的乘积,在MATLAB中,向量的点积可由函数dot来实现。
dot(a,b)
返回向量a和b的数量点积。a和b必须同维。当a和b都为列 向量时,dot(a,b) 同于a'*b;
dot(a,b,dim) 返回a和b在维数为dim的点积。 【例3.13】试计算向量a=(1,2,3)和向量6=(3,4,5)的点积。
>>a=[1 2 3]; >>b=[3 4 5】; >>dot(a,b) ans= 26
还可以用另一种方法计算向量的点积。 >>sum(a.*b)
37
ans= 26
2. 叉积计算
在数学上,向量的叉积表示过两相交向量的交点、垂直于两向量所在平面的向量。在MATLAB中,向量的叉积由函数cross来实现。
c=cross(a,b)
返回向量a和b的叉积向量c=a×b。a和b必须为三维向量。
当a和b为n维数组时,则返回a和b的dim维
c=cross(a,b,dim) 向量的
size
叉积。a和b必须有相同的维数,且size(a,dim)和
(b,dim)必须为3。
【例3.14】计算垂直于向量a=(5,2,3)和b=(3,4,5)的向量。
3. 混合积计算
在MATLAB中,向量的混合积由以上两个函数实现。 【例3.15】计算上例中向量a,b,c的混合积。
>> dot(a,cross(b,c)) ans = 456
注意函数的顺序不可颠倒,否则将会出现错误。
>> a=[5 2 3];b=[3 4 5]; >> c=cross(a,b) c =
-2 -16 14
3.4 MATLAB的矩阵运算
38
矩阵运算是MATLAB语言最重要和最具有特色的内容之一,是编程进行科学计算的重要基础。矩阵的运算包括矩阵的基本数学运算和矩阵的函数运算。
3.4.1 矩阵的基本运算
矩阵的基本数学运算包括矩阵的算术运算、与常数的运算、转置运算、逆运算、行列式运算、幂运算等。
1. 算术运算
矩阵的算术运算是指矩阵之间的加、减、乘、除、幂等运算,表3.1给出了矩阵算术运算对应的运算符和MATLAB表达式。
表3.1 经典的算术运算符
经 典 的 算 术 运 算 符 名 称 加 减 乘 除 幂 运 算 符 + - * / 或 \\ ^ MATLAB表达式 a+b a-b a*b a/b或a\\b a^n 矩阵进行加减运算时,相加减的矩阵必须是同阶的;矩阵进行乘法运算时,相乘的矩阵要有相邻公共维,即若A为i×j阶,则B必须为j×k阶,此时A和B才可以相乘。
常数与矩阵的运算,是常数同矩阵的各元素之间进行运算,如数加是指矩阵的每个元素都加上此常数,数乘是指矩阵的每个元素都与此常数相乘。需要注意的是,当进行数除时,常数通常只能做除数。
在线性代数中,矩阵没有除法运算,只有逆矩阵。矩阵除法运算是MATLAB从逆矩阵的概念引申而来,主要用于解线性方程组。
方程A*X=B,设X为未知矩阵,在等式两边同时左乘inv(A),即
inv(A)*A*X= inv(A)*B X= inv(A)*B=A\\B
把A的逆矩阵左乘以B,MATLAB就记为A\\,称之为“左除”。A、B两矩阵的行数必须相等。
39
如果方程的未知数矩阵在左,系数矩阵在右,即X*A=B,同样有
X=B*inv(A)=B/A
把A的逆矩阵右乘以B,MATLAB就记为/A,称之为“右除”。A、B两矩阵的列数必须相等。
【例3.16】 已知A*X=B,Y*C=D,A=[1,2;3,4],B=[4;10],C=[1,3;2,4],D=[4,10] ,计算未知数矩阵X和Y。
>> a=[1,2;3,4];b=[4;10];c=[1,3;2,4];d=[4,10]; >> x=a\\b x = 2.0000 1.0000 >> y=d/c y =
2.0000 1.0000
在MATLAB中,进行矩阵的幂运算时,矩阵可以作为底数,指数是标量,矩阵必须是方阵;矩阵也可以作为指数,底数是标量,矩阵也必须是方阵;但矩阵和指数不能同时为矩阵,否则将显示错误信息。 【例3.17】 矩阵的幂运算。 40
>> a a =
1 2 3 4 >> a^2 ans = 7 10 15 22 >> a^(-2) ans =
5.5000 -2.5000 -3.7500 1.7500
% n为负整数,a^n表示矩阵a自乘n次的逆。 % n为正整数,a^n表示矩阵a自乘n次。
>> inv(a^2) ans =
5.5000 -2.5000 -3.7500 1.7500 >> 2^a ans =
10.4827 14.1519 21.2278 31.7106 >> 2.^a ans = 2 4 8 16
2. 转置运算
在MATLAB中,矩阵转置运算的表达式和线性代数一样,即对于矩阵A,其转置矩阵的MATLAB表达式为A'。但应该注意,在MATLAB中,有几种类似于转置运算的矩阵元素变换运算是线性代数中没有的,他们是:
3. 逆矩阵运算
矩阵的逆运算是矩阵运算中很重要的一种运算。它在线性代数及计算方法中都有很多的论述,而在MATLAB中,众多的复杂理论只变成了一个简单的命令inv。 【例3.18】 矩阵的逆运算。
>> a a =
10 2 12 34 2 4 98 34 6
41
fliplr(X) 将X左右翻转; flipud(X) 将X上下翻转;
rot90(A) 将A逆时针方向旋转90。
>> inv(a) ans =
-0.0116 0.0372 -0.0015 0.0176 -0.1047 0.0345 0.0901 -0.0135 -0.0045
4. 行列式和秩运算
矩阵的行列式的值由det函数计算得出;矩阵的秩由rank函数来计算。 【例3.19】 计算矩阵行列式的值和矩阵的秩。
>> A =
1 1 5 2 2 5 3 3 5 >> rank(A) ans = 2 >> det(A) ans = 0
3.4.2 矩阵的函数运算
矩阵的函数运算包括基本的数学函数运算、矩阵专门的函数运算以及矩阵的分解运算等内容。
1. 数学函数运算
在MATLAB中,指数函数expm、对数函数logm、开方函数sqrtm是把矩阵作为一个整体进行运算的,即所谓的矩阵运算;其它数学函数都是对矩阵的元素分别进行运算的,即所谓的阵列运算。因此,MATLAB基本函数库中的大部分常用函数都适合于阵列运算,此时矩阵可以是任意阶。 【例3.20】 >> e=eye(2); 42
>> logm(e) ans = 0 0 0 0 >> e=ones(2); >> expm(e) ans =
4.1945 3.1945 3.1945 4.1945 >> sqrtm(e) ans =
0.7071 0.7071 0.7071 0.7071
>> a=[0,pi/6,pi/3,pi/2]; b=[-1,0,1]; >> sin(a) ans =
0 0.5000 0.8660 1.0000 >> exp(b) ans =
0.3679 1.0000 2.7183 >> sign(a) ans =
0 1 1 1 >> mean(b) ans = 0
43
在实际运算中,对其他常用函数的矩阵运算,如三角函数运算和双曲函数运算等,可以采用通用函数形式。在MATLAB中使用通用函数的格式为funm(A,'funname'),其中A为输入矩阵变量,funname为调用的函数名。如funm(b,'log')等同于1ogm(b),funm(b,'sqrt')等同于sqrtm(b),而funm(b,'sin') ,其作用等同于矩阵b的正弦运算。
【例3.21】 >> e=ones(2);
2. 矩阵函数运算
矩阵函数的运算主要包括特征值的计算,奇异值的计算,条件数、各类范数、矩阵迹的计算和矩阵的空间运算等。这里只介绍部分常用的矩阵函数。
表3.2
函数名称 cond(A) det(A) dot(A,B) eig(A) norm(A,1) norm(A)或norm(A,2) norm(A,inf) norm(A,'fro') rank(A) rcond(A) svd(A) 矩阵A的条件数 方阵A的行列式值 矩阵A,B的点积 方阵A的特征值和特征向量 矩阵A的1-范数 矩阵A的2-范数 矩阵A的无穷大-范数 矩阵A的F-范数 矩阵A的秩 矩阵A的倒条件数 矩阵A的奇异值分解 常用的矩阵函数命令
功能简介 >>funm(e,'sin') ans =
0.4546 0.4546 0.4546 0.4546 >> sin(e) ans =
0.8415 0.8415 0.8415 0.8415
44 trace(A) expm(A) expml(A) expm2(A) expm3(A) logm(A) sqrtm(A) funm(A,'fun')
矩阵A的迹 矩阵的指数e 用Pade法求矩阵的指数e 用Taylor级数求矩阵的指数e,精度差,对任何矩阵都适用 用特征值和特征向量求矩阵的指数e,仅当独立特征向量个数等于矩阵秩时适用 求矩阵A的对数 求矩阵的平方根 一般的方阵函数 AAAA(1)求矩阵的维数和长度的函数
【例3.22】>> a=[10,2,12;34,2,4;98,34,6];
>> size(a) % 求矩阵的维数 (columns & rows)。 ans = 3 3
>> length(a) % 求矩阵的长度,矩阵的长度用向量(或columns)数定义。 ans = 3
注意size(a)与length(a)两者之间的区别。 (2)特征值函数
矩阵的特征值可以由两个函数eig和eigs计算得出。其中函数eig可以给出特征值和特征向量的值,而函数eigs则是使用迭代法求解特征值和特征向量的函数。 【例3.23】 >> a=[10,2,12;34,2,4;98,34,6];
>> [v,d]=eig(a) v =
-0.2960 -0.3635 0.3600 -0.2925 0.4128 -0.7886 -0.9093 0.8352 -0.4985 d =
48.8395 0 0
45
% 产生矩阵a的特征值v和特征向量d。
0 -19.8451 0 0 0 -10.9943
(3)矩阵的范数
【例3.24】>> a=[10,2,12;34,2,4;98,34,6];
>> norm(a) ans = 109.5895 >> norm(a,1) ans = 142 >> norm(a,inf) ans = 138
(4)矩阵的条件数
【例3.25】>> a=ones(5)+i*eye(5);cond(a)
3. 矩阵分解运算
矩阵分解运算在矩阵运算中具有重要的地位。在用矩阵法求解线性方程组时,就要用到矩阵的分解运算。
表3.3
函数指令 cdf2rdf(V,D) chol(A) eig(A) Hess(A) LU(A) null(A) 基本的矩阵分解函数
功能简介 复数对角形转换成实数块对角形 矩阵A的Cholesky分解 矩阵A的特征值分解 矩阵A的Hessenberg形式 矩阵A的LU分解 由奇异值分解得出的矩阵A的零空间的标准正交基 ans = 5.0990
46
orth(A) pinv(A) qr(A) qz(A) rref(A) rsf2csf(V,D) schur(A) subspace(A,B) svd(A)
矩阵A行向量的标准正交基 求矩阵A的伪逆 矩阵A的QR正交三角分解 矩阵A的QZ分解,用于广义特征值 将矩阵A转换为逐行递减的阶梯阵 实数块对角形转换成复数对角形 矩阵A的Schur分解 计算由A,B张成的子空间的夹角 方阵A的奇异值分解 (1)矩阵的LU分解
矩阵LU分解即矩阵的三角分解:A=LU,用于线性方程组的求解。在MATLAB中,LU分解由lu函数实现。
【例3.26】求A*X=B的解。A=[5,-2,1;1,5,-3;2,1,-5],B=[4;2;-11]。
>> [L,U]=lu(A) L =
1.0000 0 0 0.2000 1.0000 0 0.4000 0.3333 1.0000 U =
5.0000 -2.0000 1.0000 0 5.4000 -3.2000 0 0 -4.3333 >> X=U\\(L\\B) X = 1.0000 2.0000 3.0000 (2)矩阵的Chol分解
47
如果A为n阶对称正定矩阵,则存在一个非奇异下三角实矩阵L,使得A=LL。当限定L的对角元素为正时,这种分解值是惟一的,称为Chollesky分解。在MATLAB中,这种分解由函数chol实现。
【例3.27】>>a=[4,-1,1;-1,4.25,2.75;1 2.75,3.5]; >> L=chol(a) L =
2.0000 -0.5000 0.5000 0 2.0000 1.5000 0 0 1.0000 (3)矩阵的QR分解
矩阵的QR分解即矩阵的正交分解。在求解矩阵的特征值时,实阵A可以写成A=QR,其中Q为正交阵,R为上三角阵。若规定R的对角元为正数,则分解惟一。在MATLAB中,QR分解由qr函数实现。 【例3.28】>> a =
10 2 12 34 2 4 98 34 6 >> [Q,R]=qr(a) Q =
-0.0960 -0.1232 -0.9877 -0.3263 -0.9336 0.1482 -0.9404 0.3365 0.0494 R =
-104.2113 -32.8179 -8.0989 0 9.3265 -3.1941 0 0 -10.9638 (4)矩阵的奇异值分解
矩阵的奇异值分解可由函数svd实现。调用形式为:[U,S,V]=svd(X),生成的U,S和V使得X=U ×S×V'。 【例3.29】a = 48
T
10 2 12 34 2 4 98 34 6 >> [u,s,v]=svd(a) u =
-0.1003 0.8857 0.4532 -0.3031 0.4066 -0.8618 -0.9477 -0.2239 0.2277 s =
109.5895 0 0 0 12.0373 0 0 0 8.0778 v =
-0.9506 0.0619 -0.3041 -0.3014 -0.4176 0.8572 -0.0739 0.9065 0.4156
3.5 MATLAB的阵列运算
MATLAB的运算是以阵列 (array) 运算和矩阵 (matrix) 运算两种方式进行的,而两者在MATLAB的基本运算性质上有所不同:阵列运算采用的是元素对元素的运算规则,而矩阵运算则是采用线性代数的运算规则。因此,在一些文献中阵列运算被称为数组运算或元素群运算。阵列的运算包括基本运算和函数运算两种形式。
3.5.1 阵列的基本运算
在MATLAB中,阵列的基本运算采用扩展的算术运算符。
表3.4
扩展的算术运算符
扩 展 的 算 术 运 算 符 49
名 称 阵列乘 阵列除 阵列幂
运 算 符 .* ./ 或 .\\ .^ MATLAB表达式 a.*b a./b或a.\\b a.^b 值得注意的是,在旧版本的MATLAB中,阵列运算的加减运算符多一个小圆点,即“.+”和“.-”,但在新版本的MATLAB中,这两个命令不再使用(否则会出错),因而阵列的加减法和矩阵的加减法完全统一起来了。
关于常数和矩阵之间的运算,数加和数减运算可以在运算符前不加“.”,但如果一定要在运算符前加“.”,那么一定要把常数写在运算符前面,否则会出错。 【例3.30】>> a=1:10;b=11:20;
>> a+b ans =
12 14 16 18 20 22 24 26 28 30 >> a.-b ??? a.-b
Error: \"identifier\" expected, \"-\" found. >> a+50 ans =
51 52 53 54 55 56 57 58 59 60 >> a.+50 ??? a.+50
Error: \"identifier\" expected, \"+\" found. >> 50.+a ans =
51 52 53 54 55 56 57 58 59 60
常数和矩阵之间的数乘运算,即为矩阵元素分别与此常数进行相乘,常数在前在后、加不加“.”都一样。常数和矩阵之间的除法运算,对矩阵运算而言常数只能做除数;而对阵列运算而言,由于是“元素对元素”的运算,因此没有任何限制(但一定要加“.”运算)。
【例3.31】a =ones(3,4); 50
>> a*8 ans =
% a*8、8*a、a.*8和8.*a结果一样。
8 8 8 8 8 8 8 8 8 8 8 8 >> a/3 法。
ans =
0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 0.3333 >> 5./a ans =
5 5 5 5 5 5 5 5 5 5 5 5 >> a./5 ans =
0.2000 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000
阵列的幂运算运算符为“.^,它表示每个矩阵元素单独进行幂运算,这是同矩阵的幂运算不同的,矩阵的幂运算和阵列的幂运算所得的结果有很大的差别。 【例3.32】>> b=[2,2;2,2] ;
>> b^2 ans = 8 8 8 8 >> b.^2 ans =
51
% a/3和3\\a都是矩阵除法,结果一样,但3/a和 a\\3不合
4 4 4 4
3.5.2 阵列的函数运算
在MATLAB中,矩阵按照阵列运算规则进行指数运算、对数运算和开方运算的命令分别是exp,log和sqrt,他们和矩阵运算expm,logm和sqrtm命令是完全不同的。矩阵进行其它数学函数运算(如三角函数)时,都是按阵列运算规则进行的,矩阵可以是任意阶,其命令通用形式为funname(A),其中funname为常用数学函数名(参见表2.3-2.8)。
【例3.33】a =ones(3,4);b=zeros(3,4);
>> exp(a) ans =
2.7183 2.7183 2.7183 2.7183 2.7183 2.7183 2.7183 2.7183 2.7183 2.7183 2.7183 2.7183 >> cos(b) ans =
1 1 1 1 1 1 1 1 1 1 1 1
表3.5以具体的计算结果给出了矩阵运算和阵列运算之间的区别。
表3.5
矩阵运算和阵列运算的对比(两个13矩阵x和y之间的运算)
阵 列 运 算 y y' x-y 4 5 6 4 5 6 -3 -3 -3 -1 0 矩 阵 运 算 x x' x+y 1 2 3 1 2 3 5 7 9 3 4 x + 2 x-2 52
5 1 4 10 18 Error Error 2 4 6 4 5/2 2 2 1 2/3 1/4 2/5 1/2 1/2 1 3/2 1 32 729 1 4 9 2 4 8 1 + 4i 2 + 5i 3 + 6i x * y x'*y x*y' Error 32 4 5 6 8 10 12 12 15 18 2 4 6 16/7 1/2 1 3/2 0 0 1/6 0 0 1/3 0 0 1/2 1/2 1 3/2 Error x.*y x'.*y x.*y' x*2 x.*2 x\\y x.\\y 2\\x 2./x x/y x./y x/2 x./2 x^y x.^y x^2 Error x.^2 2^x (x+i*y)' Error 1 - 4i 2 - 5i 3 - 6i 2.^x (x+i*y).'
3.6 关系运算与逻辑运算
除了传统的数学运算外,MATLAB还支持关系运算和逻辑运算,并按照“元素对元素”的运算规则进行运算。作为所有关系和逻辑表达式的输入,MATLAB把任何非0数值
53
当作“真(True)”,把0当作“假(False)”;对于所有关系和逻辑表达式的输出,MATLAB将“真”者以“1”表示;而将“假”者以“0”表示。
3.6.1 关系运算
关系运算是指两个矩阵或矩阵和数值之间的比较,结果共有6种情况。下面具体举例说明关系元素的规则。
表3.6
指 令 < <= > >= == ~= 基本关系运算符 含 义 小于 小于等于 大于 大于等于 等于 不等于
【例3.34】>> a=1:2:11, b=2:1:7,
a =
1 3 5 7 9 11 b =
2 3 4 5 6 7 >> a>b “0”。
ans =
0 0 1 1 1 1 >> a==b ans =
0 1 0 0 0 0 >> a>=b ans =
0 1 1 1 1 1 >> b>4 54
%比较a与b的各个元素,比较结果为“真”时置“1”,否则置
ans =
0 0 0 1 1 1 >> a-(b>4) ans =
1 3 5 6 8 10
应该注意,在关系比较中,若比较的双方为同维的矩阵,则比较的结果也是同维的矩阵,它的元素值由0和l组成。当比较双方中一方为常数,另一方为矩阵时,则结果与矩阵同维,其值为该矩阵与常数依次比较的结果。 【例3.35】>> c=rand(2,10) c =
0.7942 0.6029 0.4154 0.8744 0.7680 0.9901 0.4387 0.2140 0.3200 0.7266
0.0592 0.0503 0.3050 0.0150 0.9708 0.7889 0.4983 0.6435 0.9601 0.4120 >> compa=c>0.5 compa =
1 1 0 1 1 1 0 0 0 1 0 0 0 0 1 1 0 1 1 0 >> compb=c==0.5 compb =
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 【例3.36】>> x=(-pi:pi/3:pi)
x =
-3.1416 -2.0944 -1.0472 0 1.0472 2.0944
3.1416
>> x=x+(x==0)*eps x =
-3.1416 -2.0944 -1.0472 0.0000 1.0472 2.0944
3.1416
55
% x=0用eps代替。
%首先执行括号内的关系运算,再做四则运算。
>> sin(x)./x ans =
0.0000 0.4135 0.8270 1.0000 0.8270 0.4135
0.0000
3.6.2 逻辑运算
逻辑量只有0和1两个值。基本的逻辑运算为与、或、非三种。矩阵的逻辑运算按照“元素对元素”的运算规则进行运算。
表3.7
指 令 & | ~ 基本逻辑运算符 含 义 逻辑 and 逻辑 or 逻辑 not 【例3.37】 a=1:2:11; b=2:1:7;
(a<2) | (b>6) % 先做关系运算,再做逻辑运算 ans =
1 0 0 0 0 1
3.6.3 逻辑运算函数
除了基本的逻辑运算外,MATLAB提供了许多逻辑运算的函数。具体见下表。
表3.8
指 令 xor any all isnan isinf isfinite ischar isequal ismember 逻辑函数运算
含 义 不相同就取1,否则取0 只要有非0就取1,否则取0 全为1取1,否则为0 为数NaN取1,否则为0 为数inf取1,否则为0 有限大小元素取1,否则为0 是字符串取1,否则为0 相等取1,否则取0 两个矩阵是属于关系取1,否则取0 56
isempty isletter isstudent isprime isreal isspace 矩阵为空取1,否则取0 是字母取1,否则取0(可以是字符串) 学生版取1 质数取1,否则取0 实数取1,否则取0 空格位置取1,否则取0
【例3.38】a=1:2:11; b=2:1:7;
isequal(a,b) ans =0 isreal(a) ans =1
最后要注意的是,在算术运算、比较运算和逻辑与或非运算中,他们的优先级关系先后为:比较运算、算术运算、逻辑与或非运算。
% a是实数吗? % a与b相等吗?
57
四 MATLAB字符串
4.1 字符串的基本操作
4.1.1 字符串给变量赋值
在MATLAB中,所有字符串都要用单引号'„'将其界定,变量可以用字符串来赋值,就像变量用数值赋值一样。但要注意,在MATLAB中,字符串中的每个字符(包括空格)都是矩阵的一个元素,字符是以ASCII码储存的。 【例4.1】>> s='student'
s = student >> s(3) ans = u
% 也可以用s=['student']
字符串也可以象数值矩阵一样来连接,形成一个更大的字符串。 【例4.2】s='student';s1='who';
s=[s,s1] s = studentwho >> s(4) ans = d
% s的第4个字符
% 连接s 与s1
4.1.2 字符串长度
58
【例4.3】
>> str_num='abcde 012345+6789'
str_num = abcde 012345+6789
>> length(str_num) % 字符串的字符总数 ans = 17
>> size(str_num) ans = 1 17
% 把字符串当成一个矩阵
4.2 字符串函数
字符串的运算由字符串函数来实现,有转换运算和操作运算等。这里只介绍部分常用的字符串函数及其运算。
表4.1 字符串转换表
函数名称 abs dec2hex fprintf hex2dec hex2num int2str lower num2str setstr sprintf sscanf str2mat str2num upper eval(string) blanks(n) 功 能 字符串到ASCII转换 十进制数到十六进制字符串转换 把格式化的文本写到文件中或显示屏上 十六进制字符串转换成十进制数 十六进制字符串转换成IEEE浮点数 整数转换成字符串 字符串转换成小写 数字转换成字符串 ASCII转换成字符串 用格式控制,数字转换成字符串 用格式控制,字符串转换成数字 字符串转换成一个文本矩阵 字符串转换成数字 字符串转换成大写 作为一个MATLAB命令求字符串的值 返回一个n个零或空格的字符串 59
deblank feval findstr isletter isspace isstr lasterr strcmp strrep strtok 去掉字符串中后拖的空格 求由字符串给定的函数值 从一个字符串内找出字符串 字母存在时返回真值 空格字符存在时返回真值 输入是一个字符串,返回真值 返回上一个所产生MATLAB错误的字符串 字符串相同,返回真值 用一个字符串替换另一个字符串 在一个字符串里找出第一个标记
1. 字符串和数值之间的转换
函数num2str用来把(阿拉伯)数值转换成字符串(数值),再通过字符串连接把所转换的数嵌入到一个字符串句子中。函数str2num用来把字符串(数值)转换成(阿拉伯)数值。函数int2str用来把整数转换成字符串。无论是num2str还是int2str都调用函数sprintf,它用类似C语言语法把数值转换成字符串。 【例4.4】>> i=1:5;
>> y=num2str(i) y =
1 2 3 4 5 % 此时y不再是数字,而是字符,不能用于数值计算。 >> 1*y ans =
49 32 32 50 32 32 51 32 32 52 32
% y用ASCII值参与计算。
32 53
>> size(y) ans =
1 13 >> z=str2num(y) z =
1 2 3 4 5
% 此时z是数字,能用于数值
% 1×13字符串矩阵
计算。 60
>> 2*z
ans =
2 4 6 8 10 >> size(z) ans = 1 5
【例4.5】>> sn=['abcd12345'];
2. disp函数
函数disp允许不打印它的变量名而显示一个字符串。例如
3. input函数
函数input能输入一个字符串:x=input(' Enter anything > ',' s ') 。这里,在函数input里的附加参量’s’告诉MATLAB,“这是一个字符串”。
4. feval函数
函数feval与eval类似,但在用法上有更多的限制。feval(' fun ',x)求由字符
61
disp(s) he is a student
>> a=abs(sn) a =
97 98 99 100 49 50 51 52 53 >> size(a) ans = 1 9 >> x=num2str(a) x =
97 98 99 100 49 50 51 52 53 >> size(x) ans = 1 34
串' fun '给定的函数值,其输入参量是变量x。这说明,函数feval(' fun ',x)等价于求fun(x)的值。函数eval,feval的基本用途仅限于在用户创建的函数内。一般地,feval可求出有大量输入参量的函数值,例如,feval(' fun ', x, y, z) 等价于求fun(x, y, z)值。
5. strcmp函数
函数strcmp用于字符串的比较,例如:strcmp(s1,s2)。
6. isletter函数
函数isletter(s)用于检查字符串, 字母存在时返回真值。例如
isletter(s) ans =
s='he is a student'; strcmp(s,'he is a student') ans = 1
1 1 0 1 1 0 1 0 1 1 1 1 1 1 1
7. findstr函数
函数findstr用于查找字符串。例如
8. 大小写的变换
函数upper 和lower用于转换字符串的大小写。例如 62
upper(s) findstr(s,'a') ans = 7
ans =
HE IS A STUDENT lower('HE IS A STUDENT') ans =
he is a student
63
因篇幅问题不能全部显示,请点此查看更多更全内容