1.1 matlab 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf ·...

39
1 1. 1.1 MATLAB 的发展历程和影响 MATLAB 名字由 MATrix LABoratory 两词的前三个字母组合而成。那是 20 世纪七 十年代后期的事:时任美国新墨西哥大学计算机科学系主任的 Cleve Moler 教授出于减轻学 生编程负担的动机,为学生设计了一组调用 LINPACK EISPACK 库程序的“通俗易用” 的接口,此即用 FORTRAN 编写的萌芽状态的 MATLAB经几年的校际流传,在 Little 的推动下,由 LittleMolerSteve Bangert 合作,于 1984 年成立了 MathWorks 公司,并把 MATLAB 向市场从这MATLAB 内核采 C 语言编写,而且除原有数值计算能力外数据图视功能MATLAB 以商品形式后,仅短短几年,就以其良好开放性运行可靠性使 原先控制领域里封闭式软件包(如英国的 UMIST瑞典LUND SIMNON国的 KEDDC)纷纷淘汰,而改以 MATLAB 平台加以重建。在时间进入 20 世纪十年代的时 MATLAB 经成为国际控制界标准计算软件到九十年代期,在国际30 几个技应软件中MATLAB 数值计算方面 独占鳌头,而 Mathematica Maple 则分居符号计算软件的前两名。 Mathcad 提供计算、 图形处理环境深受学生欢迎MathWorks 公司于 1993 年推出 MATLAB4.0 版本告别 DOS 4.x 继承发展其原有数值计算和图形可视能力时,出下几个要变化1推出了 SIMULINK是一个交互作的动态系仿真分析集环境的出现使人们 有可能考虑许多不得不做简化假设的非线因素因素而大大提高人们对 非线机动态系能力2)开进行数据交换的组通了 MATLAB 进行数据分析处理件开道路3推出了符号计算工具1993 MathWorks 公司从加滑铁卢大学购得 Maple 使Maple 为“引擎Symbolic Math Toolbox 1.0MathWorks 公司此快结束了国际上数值计算、符号计算优孰劣争论成了两计算的互补发展新时代。 4作了 Notebook MathWorks 公司准应范围最广Word DDE OLEMATLAB Word 缝连接, 而为专业者创造科学计算、图形可视处理于一环境1997 仲春MATLAB5.0 世,5.15.21999 5.3 4.x 相比MATLAB 更丰富数据类结构更友善面向图形可视广学和数据分析资源发工具MATLAB5.x 特点节将更详细介绍诚然1999 Mathematica 4.0 欠缺的大数据处理能力Mathcad 也赶2000 来之前推出了 Mathcad 2000 它购Maple 和库的部分使通了MATLAB 的接口, 而把其数学计算能力提高专业层次是,影响至今仍然没一个的计算软件可MATLAB 匹敌美大学如应用代理统计、控制号处理字通 、时分析、动态系统仿真等课程的教科书都MATLAB 作为成了十年代教科书籍性标。在那MATLAB 攻读的大学生、 硕士生、 博士必须掌握本工具在国际学MATLAB 被确可靠的科学计算标准软件。在许多国际 一流学术刊物科学刊物可以MATLAB 用。 PDF 件使"pdfFactory Pro" 版本www.fineprint.cn

Upload: others

Post on 13-Jan-2020

20 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

1

1. 概 论

1.1 MATLAB的发展历程和影响

MATLAB名字由 MATrix和 LABoratory 两词的前三个字母组合而成。那是 20世纪七十年代后期的事:时任美国新墨西哥大学计算机科学系主任的 Cleve Moler教授出于减轻学生编程负担的动机,为学生设计了一组调用 LINPACK和 EISPACK库程序的“通俗易用”的接口,此即用 FORTRAN编写的萌芽状态的MATLAB。 经几年的校际流传,在 Little的推动下,由 Little、Moler、Steve Bangert合作,于 1984年成立了 MathWorks公司,并把 MATLAB正式推向市场。从这时起,MATLAB的内核采用 C语言编写,而且除原有的数值计算能力外,还新增了数据图视功能。 MATLAB以商品形式出现后,仅短短几年,就以其良好的开放性和运行的可靠性,使原先控制领域里的封闭式软件包(如英国的 UMIST,瑞典的 LUND 和 SIMNON,德国的KEDDC)纷纷淘汰,而改以 MATLAB为平台加以重建。在时间进入 20世纪九十年代的时候,MATLAB已经成为国际控制界公认的标准计算软件。 到九十年代初期,在国际上 30几个数学类科技应用软件中,MATLAB在数值计算方面独占鳌头,而 Mathematica和 Maple则分居符号计算软件的前两名。Mathcad因其提供计算、图形、文字处理的统一环境而深受中学生欢迎。 MathWorks公司于 1993年推出 MATLAB4.0版本,从此告别 DOS版。4.x版在继承和发展其原有的数值计算和图形可视能力的同时,出现了以下几个重要变化:(1)推出了SIMULINK。这是一个交互式操作的动态系统建模、仿真、分析集成环境。它的出现使人们有可能考虑许多以前不得不做简化假设的非线性因素、随机因素,从而大大提高了人们对

非线性、随机动态系统的认知能力。(2)开发了与外部进行直接数据交换的组件,打通了MATLAB进行实时数据分析、处理和硬件开发的道路。(3)推出了符号计算工具包。1993年 MathWorks公司从加拿大滑铁卢大学购得 Maple的使用权,以 Maple为“引擎”开发了Symbolic Math Toolbox 1.0。MathWorks公司此举加快结束了国际上数值计算、符号计算孰优孰劣的长期争论,促成了两种计算的互补发展新时代。(4)构作了 Notebook 。MathWorks公司瞄准应用范围最广的Word ,运用 DDE和 OLE,实现了 MATLAB与Word的无缝连接,从而为专业科技工作者创造了融科学计算、图形可视、文字处理于一体的高水准环境。 1997年仲春,MATLAB5.0版问世,紧接着是 5.1、5.2,以及和 1999年春的 5.3版。与 4.x相比,现今的 MATLAB 拥有更丰富的数据类型和结构、更友善的面向对象、更加快速精良的图形可视、更广博的数学和数据分析资源、更多的应用开发工具。(关于 MATLAB5.x的特点下节将作更详细的介绍。) 诚然,到 1999年底,Mathematica也已经升到 4.0版,它特别加强了以前欠缺的大规模数据处理能力。Mathcad 也赶在 2000年到来之前推出了 Mathcad 2000 ,它购买了 Maple内核和库的部分使用权,打通了与 MATLAB的接口,从而把其数学计算能力提高到专业层次。但是,就影响而言,至今仍然没有一个别的计算软件可与MATLAB匹敌。 在欧美大学里,诸如应用代数、数理统计、自动控制、数字信号处理、模拟与数字通

信、时间序列分析、动态系统仿真等课程的教科书都把MATLAB作为内容。这几乎成了九十年代教科书与旧版书籍的区别性标志。在那里,MATLAB是攻读学位的大学生、硕士生、博士生必须掌握的基本工具。 在国际学术界,MATLAB已经被确认为准确、可靠的科学计算标准软件。在许多国际一流学术刊物上,(尤其是信息科学刊物),都可以看到MATLAB的应用。

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 2: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

2

在设计研究单位和工业部门,MATLAB被认作进行高效研究、开发的首选软件工具。如美国 National Instruments公司信号测量、分析软件 LabVIEW,Cadence公司信号和通信分析设计软件 SPW等,或者直接建筑在 MATLAB之上,或者以 MATLAB为主要支撑。又如HP公司的 VXI硬件,TM公司的 DSP,Gage公司的各种硬卡、仪器等都接受 MATLAB的支持。

1.2 MATLAB 5.3的基本组成和特点

经过近 20年实践,人们已经意识到:MATLAB作为计算工具和科技资源,可以扩大科学研究的范围、提高工程生产的效率、缩短开发周期、加快探索步伐、激发创造活力。那

末,作为当前最新版本的MATLAB 5.3究竟包括哪些内容?有哪些特点呢?

1.2.1 MATLAB的语言部分

5.0以前版本的 MATLAB语言比较简单。它只有双精度数值和简单字符串两种数据类型,只能处理 1维、2维数组。它的控制流和函数形式也都比较简单。这一方面与当时软件的整体水平有关,另方面与 MATLAB仅限于数值计算和图形可视应用的设计目标有关。 从 5.0版起,MATLAB对其语言进行了根本性的变革,使之成为一种高级的“阵列”式语言。

1.2.1.1 MATLAB语言的传统优点 MATLAB自问世起,就以数值计算称雄。MATLAB进行数值计算的基本处理单位是复数数组(或称阵列),并且数组维数是自动按照规则确定的。这一方面使 MATLAB程序可以被高度“向量化”,另方面使用户易写易读。 比如已知 t的采样数据是 )( mn × 维数组,要计算 )5sin(2 tey t−= 。对一般的计算语言

来说,必须采用两层循环才能得到结果。这不但程序复杂,而且那讨厌的循环十分费时。

MATLAB 处理这类问题则简洁快捷得多,它只需直截了当的一条指令 y = exp(-2*t).*sin(5*t) ,就可获得同样是 )( mn × 维的 y数组。这就是所谓的“数组运算”。这种运算在信号处理和图形可视中,将被频繁使用。

又如对于求解 bAx = 代数方程问题。教科书的基本叙述:当 A是标量时,Abx = ;当

A是非奇异矩阵时, bAx 1−= ;当 A是行数大于列数的满秩阵时, bAAAx TT 1)( −= ;当

A的列数大于行数时, x有无数解。一般程序就必须按以上不同情况进行编程。然而对MATLAB来说,那只需一条指令:x=A\b 。指令是简单的,但其内涵却远远超出了普通教科书的范围,其计算的快速性、准确性和稳定性都是普通程序所远不及的。

1.2.1.2 5.3 的语言新特点 (1)数据类型和面向对象编程技术 MATLAB5.x 版与旧版最显著的不同在于数据类型的变化。5.x 版现有六种基本数据类型:双精度数组、字符串数组、元胞数组、构架数组、稀疏矩阵和 unit8数据。 数据类型的变革,面向对象编程技术的采用,所产生的影响是广泛而深层的。这种影

响首先表现在 MATLAB的自身。从 5.0版起,MATLAB就用新数据类型逐步地对其自身的函数指令加以改造。这个过程一直延续到 5.3版才基本完成。比如 5.3版就推出了一组名称全新(求取极小值等)的泛函指令,它们优化参数的设置是采用构架数组进行的。再如 5.x版提供的常微分方程解算指令 ODE Solver的参数设置也全是靠新数据类型进行的。 新数据类型和面向对象技术的影响之二:若干通用工具包的相应升级。以符号计算为

例,在 MATLAB 4.2c中, Symbolic Math Toolbox 1.0版处理符号计算的指令形式与数值计

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 3: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

3

算指令形式很不协调,显得十分生硬。比如,符号矩阵的“四则”运算的旧版指令分别是

symadd , symsub , symmul 和 inverse 。但在 5.x版中,符号工具包已升级为 2.0版,新的“四则”符号运算指令形式上与数值计算完全相同,它们分别是 + , - , * , / 。新的符号计算形式已被改造得与“MATLAB风格数值计算形式”浑然统一。 新数据类型和面向对象技术影响之三:一系列的应用工具包相继升级。这不仅使应用

工具包表现更为友善,而且功能大大加强。以控制工具包为例,新版利用构架数组和重载

技术,把线性时不变系统(Linear Time-Invariant system)设计为“LTI对象”。这样处理后,不管 LTI 是由传递函数产生、由零极点增益方式产生,还是由状态方程形式创建,只要是LTI对象,它们之间就可方便地进行各种数学运算。比如在控制教科书上,由前向控制环节

1G 、对象 0G 、反馈环节 2G 组成的负反馈闭环系统传递函数210

10

1 GGGGGG

+= 。假如 0G 、

1G 、 2G 都是用传递函数,那末读者“手算”时,必须进行多项式展开、乘法 、合并、简化等运算。如果利用“旧版 MATLAB”求G,那末必须先使用 series指令把 0G 、 1G 串接成“中间”函数 01G ,然后再用 feedback指令由 01G 、 2G 算得G。然而“新版 MATLAB”只需直截了当的一条指令 G=G0*G1/(1+G0*G1*G2) ,并且式中的 G0 , G1 , G2的表达形式可以各不相同,任取传递函数、零极点增益、状态方程等形式。当然 LTI的优点远不至此,比如它还可直接对多输入多输出系统进行统一运算,而无须分解成若干个子系统进行。 (2)控制流和函数类型 新版 MATLAB的控制流新增了多分支结构 switch-case、try-catch结构和警告提示指令error、warning 。这进一步提高了程序的可读性和运行可靠性。 新版的函数类型大大丰富,适应编制和管理复杂程度不同的程序。例如内联函数比较

简练,适用于各类比较简单数学模型。而子函数、私用函数的增添,使得复杂函数比较容

易组织,既提高了软件的“重用度”,又避免了众多内存变量名的冲突、庞大工具库的函

数名冲突。 为函数设计了新的变长度输入输出宗量 varagin、varagout。采用了这种变长度宗量,MATLAB自身的新版指令被进一步“柔性化”。一个指令可以接受任意多个输入宗量,可以产生任意多个输出宗量,以适应不同场合的需要。可使得所有这些措施使得MATLAB能更加便捷地编制复杂的大型程序。当然,用户也可以借助这种变长度宗量来编制灵活多变

的应用程序。

1.2.2 MATLAB的工作环境

所谓工作环境是指:帮助系统、工作内存管理、指令和函数管理、搜索路径管理、操

作系统、程序调试和性能剖析工具等。

1.2.2.1 传统工作环境 与同时期其他数学类软件相比,旧版 MATLAB的工作环境虽属比较友善之列,但其工作环境确实比较“单调”。它的帮助系统是“纯文本”形式的;内存管理、路径管理、调

试工具是单纯指令操纵形式的;文件类型也形式单一,仅有 M文件和 MAT文件。4.2c版情况开始变化,但那只是过渡形式。

1.2.2.2 5.3工作环境新特点 (1)大量引入图形用户界面 5.x版改变了过去单调依靠“在指令窗通过纯文本形指令进行各种操作”面貌,引入了许多让使用者一目了然的图形界面,如在线帮助的交互型界面 helpwin ,管理工作内存的workspace ,交互式的路径管理界面 pathtool ,指令窗显示风格设置界面等。它们的开启方式有:工具条图标开启、选择菜单项开启,直接“文本式”指令开启。

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 4: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

4

5.3版更进一步把图形显示窗改造成了交互操作的可编辑图形界面。 (2)引入了全方位帮助系统 “临场”在线帮助:这些帮助内容,大多嵌附在 M文件中,即时性强,反应速度快。它对求助内容的回答最及时准确。MATLAB旧版就一直采用这种帮助系统,并深受用户欢迎。新版保留原功能的同时,还新增一个内容与之完全对应的图形界面 helpwin ,加强了对用户的向导。 综合型在线帮助文库 helpdesk :该文库以 HTML 超文本形式独立存在。整个文库按MATLAB的功能和核心内容编排,系统性强,且可以借助“超链接”方便地进行交叉查阅。但是,这部分内容偶而发生与真实 M文件脱节的现象。 完整易读的 PDF文档:这部分内容与 HTML帮助文库完全对应。PDF文档不能直接从指令窗中开启,而必须借助 Adobe Acrobat Reader软件阅读。这种文件的版面清楚、规范,适宜有选择地系统阅读,也适宜于制作硬拷贝。 演示软件 demo :这是一个内容广泛的演示程序。MATLAB一向重视演示软件的设计,因此无论 MATLAB旧版还是新版,都随带各自的演示程序。只是,新版内容更丰富了 。 (3)M文件编辑、调试 的集成环境 新的编辑器有十分良好的文字编辑功能。它可采用色彩和制表位醒目地区分标识程序

中不同功能的文字,如运算指令、控制流指令、注释等。通过编辑器的菜单选项可以对编

辑器的文字、段落等风格进行类似Word那样的设置。 从 5.2版起,还新增了“变量现场显示”功能,只要把鼠标放在变量名上(Mouse over),就能在现场显示该变量的内容。 在 5.x版中,调试器已经被图形化,它与编辑器集成为一体。只需点动交互窗上的调试图标就可完成对程序的调试。 (4)M文件的性能剖析 调试器只负责M文件中语法错误和运行错误的定位,而性能剖析指令 profile 将给出程序各环节的耗时分析报告。5.3版剖析指令的分析报告特别详细,它将帮助用户寻找影响程序运行速度的“瓶颈”所在,以便改进。 (5)Notebook新的安装方式 从 4.2c版引入 Notebook以来,这种集文字、计算、图形于一体的“活”环境就深受用户赞赏。但直到 5.2版至,Notebook的安装都是与 MATLAB的安装同步进行的。这种安装方式的不便之处是:一旦 Word发生变动,就必须把 MATLAB全盘重装。5.3版改变了这种局面,它可以在 MATLAB指令窗中“随时”进行安装 Notebook,省时灵活。 (6)MATLAB环境可运行文件的多样化 旧版中,用户可编制和运行的程序文件只有 M脚本文件和 M函数文件。5.x版新增了产生伪代码 P文件的 pcode指令和产生二进制 MEX文件的 mex 指令。较之 M文件,这两种文件的运行速度要快得多,保密性也好。

1.2.3 MATLAB的图视系统

1.2.3.1 传统的图形表现力 MATLAB的图形可视能力在所有数学软件中是首屈一指的。MATLAB的图形系统有高层和低层两个部分组成。高层指令友善、简便;低层指令细腻、丰富、灵活。 一般说来,不管二元函数多么复杂,它的三维图形,仅需 10条左右指令,就能得到富于感染力的表现。数据和函数的图形可视手段包括:线的勾画、色图使用、浓谈处理、视

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 5: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

5

角选择、透视和裁剪。MATLAB有比较完备的图形标识指令,它们可标注:图名、轴名、解释文字和绘画图例。

1.2.3.2 5.3版的图视新特点 (1)5.3版的可编辑图形窗 对一般用户来说,在使用 MATLAB5.3 版图形功能时,感受最强烈的变化是图形窗。此前的图形窗只具单纯的显示功能。5.3版则不同,它是可编辑的图形显示窗。在 5.3的图形窗里,只需点动工具图标或菜单选项,就可直接对显示图形的各种“对象属性”进行随

心所欲的设置,可交互式地改变线条型式、粗细、颜色,可动态地变换观察视角,可在图

形窗随意位置标识文字或子图。5.3版图形窗是十分成功的“图柄”操作的图形用户界面。 (2)5.x版的 Tex特殊字符集 图形功能的另一个较大变化是标识能力的大大增强。具体表现:一,引进 Tex 特殊字符子集,可标注如 ,, βα ∑等数学字符;二,可书写上下标;三,可对英文、中文进行字体

形式和大小的设置。四,可采取多种方式进行多行文字注释。 (3)5.x版的简捷绘图指令 这组指令的特点是“指令的前两个字母是 ez ”,英文含义是“Easy to ”。这组指令有两个功能:一,直接表现用字符串描写的函数图形;二,与符号计算配套使用,作为符号

计算结果的图形可视工具。 这种指令的使用方法极其简单。例如使用一条指令 ezsurf('y/(1+x^2+y^2)') 就可以绘制

二元函数 221 yxyz

++= 的曲面。

这组指令与普通“数值型”绘图指令起着互为补充的作用。假若就方便易用排序,简捷指

令最方便,普通“数值型”绘图指令次之,低层指令最繁;假若就绘图的细致和个性化能

力排序,那末低层指令最强,简捷指令最弱。 (4)5.x版增强了高层绘图指令的排版能力 新版在同一图形窗口中可设置大小不同、非等距排列的任意个子图,而旧版只能开设

面积等分的子图。新版可以在同一图形中使用两套不同的坐标系统,而旧版不能。 (5)5.x版新增的其他高层绘图指令 增添了主要用于表现统计数据的面域图 area , 水平直方图 barh , 三维直方图 bar3 , bar3h , 二维、三维饼图 pie , pie3 , 三维杆图 stem3等;新增了四维数值表现力更强的切片等位线图 slicecontour ;改造了切片图 slice ,允许任意设置切面;新增了表现不规则数据点的三维网线和曲面图 trimesh , trisurf ;新增了若干色图函数,如 spring , summer , autumn , winter 等;增加了表现数据点的 8种新“点型”。 (6)5.x版读写图象文件能力的加强 旧版 MATLAB 能读写的图象文件类型比较狭窄。新版能够读写的文件格式有:bmp , hdf , jpg , jpeg , pex , tif , tiff , xwd 等。这无疑为进一步开拓图象处理方面的应用程序提供了更好的条件。 (7)5.x版低层指令结构的改变和能力的加强 “轴”对象上新增的“子对象”light 。该对象的增设,再配合增强了的光照模式 lighting 和控制光线反射的材质指令 material ,使得图形表现具真实感。 “轴”新增的照相机属性和投影属性,能更好地满足人们的视觉要求。

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 6: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

6

“面”对象的面色属性可以采用纹理影射技术,从而可以在各种形状曲面上彩绘各种

图象,或表现表面的凹凸不平、材料纹路。 (8) 5.3版的图形用户界面 GUI制作工具 从 4.2c版起,MATLAB就开始向用户提供制作 GUI的指令,但十分稚嫩。随 5.0 , 5.1 , 5.2 版的升级,GUI制作工具不断改进。现在 5.3版中:不仅可以制作位置固定的用户菜单uimenu ,而且可以制作位置不固定的“现场”菜单(Context menu);用户控件 uicontrol已增加到 10种;不管是菜单,还是控件,都可以进行“使能”和“可见性”控制。 MATLAB向用户提供两种制作 GUI的途径:依靠指令制作 GUI;借助交互式工具 guide 制作 GUI 。这两种方法各有优缺点:前者灵活、细致;后者直观、全局观念强。用户交替运用这两种制作手段,可高效地制作 GUI ,开发出各种生动活泼的应用程序。

1.2.4 MATLAB的数学函数库

1.2.4.1 世界一流水平的数值计算函数库 MATLAB自问世起,就抱定一个宗旨:其所有数值计算算法都必须是国际公认的、最先进的、可靠算法;其程序由世界一流专家编制,并经高度优化;而执行算法的指令形式

则必须简单、易读易用。MATLAB正是仰赖这些高质量的数值计算函数赢得了声誉。 MATLAB数值计算函数库的另一个特点是其内容的基础性和通用性。它正由于这一特点,而适应了诸如自动控制、信号处理、动力工程、电力系统等应用学科的需要,并进而

开发出一系列应用工具包。 在整个 MATLAB的发展过程中,这数值计算函数库,从内容到形式,变化最小。

1.2.4.2 5.x版函数库的变化 (1)5.x版新增的常微分方程解算程序 5.x版MATLAB数值计算方面的最大变化是增添了一组常微分方程数值解算程序 ODE Solver 。这组解算程序无论是算法还是软件结构都十分精良,它包含 ode23 , ode45 , ode113 , ode23t ,ode15s , ode23s , ode23tb等不同解算指令,用以解算包括 Stiff方程在内的各种微分方程。 MATLAB5.x为解 ODE 问题所设计的文件十分严整,包括解算指令 Solver 、被 Solver调用的微分方程描述文件、进行积分算法参数设置的 odeset 和 odeget 、解算输出指令 odeplot , odephas2等。 (2)5.x新增的其他数值计算指令 5.x版新增的许多计算指令与数值计算方面的最新成就直接相关。举例来说,新版及时的增添了广义奇异值计算指令 gsvd ;高维快速 Fourier变换和反变换 fftn , ifftn ;高维插值指令 interpn 等。

1.2.4.3 5.x版的符号计算工具包 关于符号计算和数值计算优劣的争论曾经历过一段时间,但那是 20世纪九十年代以前的事。MathWorks公司打破门户之见,把 MAPLE的内核和数学函数库引入了 MATLAB,从而使 MATLAB 具有了数值和符号双重计算能力。用户可以视具体问题而进行适当的选择。比如,对于比较复杂的“初值类”非线性微分方程,有时符号计算或无法解、或求解

时间太长,而数值算法却比较有效;反之,对于边值类微分方程,数值算法的实现可能比

较繁琐,而符号计算有时倒比较简便。 MAPLE 的函数库十分庞大,包含 2000多个函数。它几乎囊括了一般用户所需的所有函数。与 5.x版 MATLAB配用的 Symbolic Math Toolbox 2.0 允许用户在三个不同层次上符

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 7: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

7

号计算。第一层次是,在进行符号对象定义后,直接利用 MATLAB格式进行矩阵分解、微分、积分、积分变换、代数方程求解、微分方程求解等运算。第二层次是,借助 maple 指令,把单个 MAPLE格式的指令送往 MAPLE引擎计算。第三层次是,借助 procread 把整段 Maple程序送往MAPLE计算。

1.2.5 MATLAB与外部程序的交互

MATLAB的卓越性能引发了用户的新需求:希望把在 MATLAB 环境中编制的程序开发成能脱离 MATLAB独立运行的程序;希望能在外部程序中调用 MATLAB作为计算引擎。需求决定商品,市场也真出现了诸如Mediva等商品软件,能把 MATLAB的M文件转变为独立于平台的 EXE可执行文件;出现许多专用软件把 MATLAB直接当计算引擎使用。鉴于此,MATLAB在 4.x版时代的后期,就尝试性地推出了自己的编译器。

1.2.5.1 与 5.3版配用的编译器 Compiler 2.0 伴随 MATLAB5.0版向 5.3版升级的过程中,变化较大,更新较快的是 MATLAB编译器。与 5.2版配用的是 Compiler 1.2版,而与 5.3版配用的则是 Compiler 2.0版、2.0.1版。 无论是 1.2版编译器,还是 2.0版编译器,它们都不但可以把全 M函数文件编译成独立应用程序,而且也可以把 C或 FORTRAN程序与 M文件混编成独立应用程序。这种程序的优点是:一,可以脱离 MATLAB环境独立运行;二,运行速度快。 MATLAB编译器无疑给用户开发计算类 EXE可执行程序提供了快捷、高效的工具。举例来说,假如用户想编制一个求解各类线性代数方程的可独立执行的程序,用户只要先在

MATLAB环境中编写由 30来条指令组成的 M函数文件,然后借助编译器把它变成独立执行的 EXE程序。这 EXE文件不但可以计算“恰定”方程,而且可以解算“超定”、“欠定”方程。值得指出:原M文件是不过 2K字节的小小程序。而编译生成的 EXE文件却超过 200K 字节,这可是一个不算小的程序。 与 1.2版相比,2.0版编译器具有处理高维数组、元胞数组、构架数组的能力,支持变长度输入输出宗量,支持多分支等控制流。

1.2.5.2 5.x版的 API应用程序接口 与 MATLAB编译器相比,MATLAB的 API应用程序接口问世得更晚,也更不成熟。MATLAB API 由一系列接口指令组成。借助这些接口指令,用户就可在 C或 FORTRAN中,或直接读写 MATLAB的MAT数据文件,或把 MATLAB当作计算引擎使用。

1.3 与MATLAB 5.3配用的 SIMULINK3.0

SIMULINK 是 MathWorks 公司开发的又一个产生重大影响的软件产品。它的前身SIMULIB 问世于 20 世纪九十年代初,以工具库的形式挂接在 MATLAB 3.5 版上。以SIMULINK名称广为人知,是在 MATLAB 4.2x版时期。SIMULINK不能独立运行,而只能在 MATLAB环境中运行。现在较为流行的有:与 MATLAB5.2版配用的 SIMULINK2.2 ;与 MATLAB5.3版配用的 SIMULINK3.0 。

1.3.1 SIMULINK的传统优点

不管是什么版本,SIMULINK 总由模块库、模型构造及分析指令、演示程序等三部分组成。在 SIMULINK环境中,对于由微分方程或差分方程描写的动态系统,用户无须编写文本形式的程序,而只要通过一些简单的鼠标操作就可形象地建立起被研究系统的数学模

型,并进行仿真和分析研究。

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 8: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

8

举例来说,面对一个由微分方程描写的动态系统,用户有如下三个研究途径:一,直

接利用 ODE Solver数值解算指令编写表示那系统的 M文件;二,利用符号计算指令编写相应的程序;三,在 SIMULINK环境中建立那系统的方块图模型。三者比较而言,SIMULINK 是最合适、最方便、最直观的研究环境。在 SIMULINK中,那些以往不得不忽略的非线性、随机干扰等因素的影响也十分容易研究。

1.3.2 SIMULINK 3.0的特点

(1)SIMULINK系列软件产品 经过几年的努力,MathWorks公司已经把 SIMULINK发展成一个系列产品。例如,它与 Stateflow 状态流配合,可以建立更清晰的离散事件系统的概念化模型;与 Real-Time Workshop配合可产生进行实时仿真和运行于各种硬件的 C码;与 DSP Blockset 配用可以进行 DSP 装置和系统的快速设计和仿真。SIMULINK 在 Communication Toolbox、 Nonlinear Control Design Blockset、Power System Blockset等专业工具包的配合下,就可对通信系统、非线性控制系统、电力系统进行深入的建模、仿真和分析研究。 (2)SIMULINK3.0的模型库 与以前版本相比,SIMULINK3.0版本体模型库的结构已彻底改变。原先是子库分层的块图结构,现在是树状的文件夹形式,并且旧版中只有部分子库与新版文件夹对应。 与 SIMULINK3.0版配用的工具包显著增加。新版除把原 2.2版 12 个应用子库改造为12个文件夹之外,又增添了 2个新文件夹。 (3)模块的“使能”和“触发”功能 从 2.x版起,SIMULINK增设了“使能”和“触发”功能。这就为 SIMULINK进行离散事件系统的仿真打下了基础。借助“使能”和“触发”功能,用户可以建立各种根据状

态组合和迁移改变模型结构的复杂系统。

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 9: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

1

2. 基础准备及入门

2.1 MATLAB 5.x 版对外部系统的要求

2.2 MATLAB的安装

2.3 MATLAB环境的启动

2.4 MATLAB指令窗简介

2.4.1 工具条

2.4.2 菜单选项

2.5 指令窗运行入门

2.5.1 最简单的计算器使用法

【例 2.5.1-1】求 23)]47(212[ ÷−×+ 的算术运算结果。

(1)用键盘在 MATLAB指令窗中输入以下内容 >> (12+2*(7-4))/3^2 (2)在上述表达式输入完成后,按【Enter】键,该就指令被执行。 (3)在指令执行后,MATLAB指令窗中将显示以下结果。 ans = 2

【例 2.5.1-2】简单矩阵

=

987654321

A 的输入步骤。

(1)在键盘上输入下列内容 A = [1,2,3; 4,5,6; 7,8,9] (2)按【Enter】键,指令被执行。 (3)在指令执行后,MATLAB指令窗中将显示以下结果: A = 1 2 3 4 5 6 7 8 9

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 10: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

2

【例 2.5.1-3】矩阵的分行输入 A=[1,2,3 4,5,6 7,8,9] (以下是显示结果) A = 1 2 3 4 5 6 7 8 9 【例 2.5.1-4】指令的续行输入(以下格式在除 Notebook外的 MATLAB环境中可运行) S = 1 – 1/2 + 1/3 –1/4 + 1/5 – 1/6 ... + 1/7 – 1/8 S =

0.6345

2.5.2 数值、变量和表达式

2.5.2.1 数值的记述

2.5.2.2 变量命名规则

2.5.2.3 MATLAB默认的预定义变量

2.5.2.4 表达式

2.5.2.5 复数和复数矩阵

【例 2.5.2.5-1】复数i

eziziz 6321 2,21,43

π

=+=+= 表达,及计算3

21

zzzz = 。

(1)经典教科书的直角坐标表示法 z1= 3 + 4i z1 = 3.0000 + 4.0000i (2)采用运算符构成的直角坐标表示法和极坐标表示法 z2 = 1 + 2 * i %运算符构成的直角坐标表示法 z3=2*exp(i*pi/6) %运算符构成的极坐标表示法 z=z1*z2/z3 z2 = 1.0000 + 2.0000i z3 = 1.7321 + 1.0000i z = 0.3349 + 5.5801i

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 11: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

3

【例 2.5.2.5-2】复数矩阵的生成及运算 A=[1,3;2,4]-[5,8;6,9]*i B=[1+5i,2+6i;3+8*i,4+9*i] C=A*B A = 1.0000 - 5.0000i 3.0000 - 8.0000i 2.0000 - 6.0000i 4.0000 - 9.0000i B = 1.0000 + 5.0000i 2.0000 + 6.0000i 3.0000 + 8.0000i 4.0000 + 9.0000i C = 1.0e+002 * 0.9900 1.1600 - 0.0900i 1.1600 + 0.0900i 1.3700 【例 2.5.2.5-3】求上例复数矩阵 C的实部、虚部、模和相角。 C_real=real(C) C_imag=imag(C) C_magnitude=abs(C) C_phase=angle(C)*180/pi %以度为单位计算相角 C_real = 99 116 116 137 C_imag = 0 -9 9 0 C_magnitude = 99.0000 116.3486 116.3486 137.0000 C_phase = 0 -4.4365 4.4365 0

2.5.3 计算结果的图形表示

【例 2.5.3-1】画出衰减振荡曲线 teyt

3sin3−

= 及其它的包络线 30

t

ey−

= 。 t的取值范围是]4,0[ π 。

t=0:pi/50:4*pi; %定义自变量取值数组 y0=exp(-t/3); %计算与自变量相应的 y0数组 y=exp(-t/3).*sin(3*t); %计算与自变量相应的 y数组 plot(t,y,'-r',t,y0,':b',t,-y0,':b') %用不同颜色、线型绘制曲线 grid %在“坐标纸”画小方格

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 12: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

4

0 2 4 6 8 10 12 14-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

图 2.5.3-1 衰减振荡曲线与包络

【例 2.5.3-2】画出22

22 )sin(

yx

yxz

+

+= 所表示的三维曲面。 yx, 的取值范围是 ]8,8[− 。

clear;x=-8:0.5:8; %定义自变量 x的一维刻度向量 y=x'; %定义自变量 y的一维刻度向量 X=ones(size(y))*x; %计算自变量平面上取值点 x坐标的二维数组 Y=y*ones(size(x)); %计算自变量平面上取值点 y坐标的二维数组

R=sqrt(X.^2+Y.^2)+eps; %计算中间变量 22 yxR += <5>

Z=sin(R)./R; %计算与自变量二维数组相应的函数值R

Rz sin= <6>

mesh(Z); %绘制三维网格图 colormap(hot) %指定网格图用 hot色图绘制

图 2.5.3-2 三维网线图

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 13: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

5

2.6 控制指令窗的指令、操作和标点

2.6.1 常用控制指令

2.6.2 数值计算结果的显示格式

2.6.3 指令行的编辑 【例 2.6.3-1】指令行操作过程示例。

(1)若用户想计算51

)3.0sin(21

+=

πy 的值,那末用户应依次键入以下字符

y1=2*sin(0.3*pi)/(1+sqrt(5)) (2)按【Enter】键,该指令便被执行,并给出以下结果 y1 = 0.5000 在以上操作和计算结束后,操作指令和计算结果都记录在 MATLAB工作内存中。因此,假如用户希望调回前面输入的指令重新运行,或希望对前面输入的指令加以修改后再运行,

那末只要反复按动键盘上的箭头键,就可从内存中把以前输入的那指令调回到当前行,以

供重新运行或修改后运行。新的计算结果,只可能被此后运行的指令所使用,而绝不会影

响以前生成的(非同名)变量的“内容”。 (3)利用指令回调,进行新的计算。

若又想计算51

)3.0cos(22

+=

πy ,用户当然可以象前一个算例那样,通过键盘把相应字

符一个一个“敲入”。但也可以较方便地用操作键获得该指令,具体办法是:先用á键调回已输入过的指令 y1=2*sin(0.3*pi)/(1+sqrt(5)) ;然后移动光标,把 y1改成 y2;把 sin 改成 cos 便可。即得 y2=2*cos(0.3*pi)/(1+sqrt(5)) y2 = 0.3633

2.6.4 指令行中的标点符号

2.6.5 内存变量的查阅和删除

2.6.5.1 指令 who和 whos 【例 2.6.5.1-1】用 who 检查 MATLAB内存变量。 在指令窗中运行以下指令,就可看到内存变量。 who Your variables are: R Y x y1 X Z y y2 【例 2.6.5.1-2】键入 whos ,获得驻留变量的详细情况:全部变量名,变量的数组维数,占用字节数,变量的类别(如双精度),是否复数等。 whos Name Size Bytes Class

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 14: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

6

R 33x33 8712 double array X 33x33 8712 double array Y 33x33 8712 double array Z 33x33 8712 double array x 1x33 264 double array y 33x1 264 double array y1 1x1 8 double array y2 1x1 8 double array Grand total is 4424 elements using 35392 bytes

2.6.5.2 内存浏览器和变量编辑器

2.6.6 变量的文件保存

2.6.6.1 通过菜单保存和再度读取变量

2.6.6.2 save 和 load 指令 【例 2.6.6.2-1】数据的存取。 (1)建立用户目录,并使之成为当前目录,保存数据 mkdir('c:\','my_dir'); %在 C盘上创建目录 my_dir cd c:\my_dir %使 c:\my_dir成为当前目录 save saf X Y Z %选择内存中的 X,Y,Z变量保存为 saf.mat文件 dir %显示目录上的文件 . .. saf.mat (2)清空内存,从 saf.mat 向内存装载变量 Z clear %清除内存中的全部变量 load saf Z %把 saf.mat文件中的 Z变量装入内存 who %检查内存中有什么变量 Your variables are: Z 〖说明〗 l 本例运用了例 2.5.3-2和例 2.6.3-1中指令运行后产生的变量。 l 如果一组数据是经过长时间的复杂计算后获得的,那末为避免再次重复计算,常使用

save 加以保存。此后,每当需要,都可通过 load重新获取这组数据。这种处理模式常在实际中被采用。

2.7 操作实录指令和M脚本文件

2.7.1 操作实录指令

2.7.2 M脚本文件编写初步

2.8 在线自学引导和演示指令

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 15: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

7

2.8.1 在线提供的入门引导

2.8.2 在线演示

2.9 帮助系统

2.9.1 帮助系统的构造

2.9.2 指令窗中的 help 指令

2.9.2.1 直接使用 help获得指令的使用说明 【例 2.9.2.1-1】假如准确知道所要求助的主题词,或指令名称,那末使用 help 是获得在线帮助的最简单有效的途径。本例演示:关于矩阵对数函数 logm 使用说明的在线求助。 help logm LOGM Matrix logarithm.

L = LOGM(A) is the matrix logarithm of A, the inverse of EXPM(A). Complex results are produced if A has negative eigenvalues. A warning message is printed if the computed expm(L) is not close to A.

[L,esterr] = logm(A) does not print any warning message, but returns an estimate of the relative residual, norm(expm(L)-A)/norm(A).

If A is real symmetric or complex Hermitian, then so is LOGM(A).

Some matrices, like A = [0 1; 0 0], do not have any logarithms, real or complex, and LOGM cannot be expected to produce one.

See also EXPM, SQRTM, FUNM.

2.9.2.2 使用 help指令进行分类搜索 【例 2.9.2.2-1】运行不带任何限定的 help,可以得到分类名称明细表。 help HELP topics: matlab\general - General purpose commands. matlab\ops - Operators and special characters. matlab\lang - Programming language constructs. matlab\elmat - Elementary matrices and matrix manipulation. matlab\elfun - Elementary math functions. matlab\specfun - Specialized math functions. ...... ...... For more help on directory/topic, type "help topic".

2.9.2.3 采用 help topic指令形式获得具体子类的指令明细 【例 2.9.2.3-1】如果用户想知道有关矩阵操作指令一栏表,那末就运行以下指令。 help elmat Elementary matrices and matrix manipulation. Elementary matrices. zeros - Zeros array.

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 16: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

8

ones - Ones array. ...... ...... Basic array information. size - Size of matrix. length - Length of vector. ...... ...... Matrix manipulation. reshape - Change size. diag - Diagonal matrices and diagonals of matrix. ...... ...... Special variables and constants. ans - Most recent answer. eps - Floating point relative accuracy. ...... ...... Specialized matrices. compan - Companion matrix. gallery - Higham test matrices. ...... ...... 〖说明〗 l 省略号由笔者所加,用来表示被删除的内容。这样做是出于节省篇幅的考虑。

2.9.3 指令窗中的 lookfor 指令 【例 2.9.3-1】查找包含积分这个关键词的所有指令。 lookfor integral ELLIPKE Complete elliptic integral. EXPINT Exponential integral function. DBLQUAD Numerically evaluate double integral. INNERLP Used with DBLQUAD to evaluate inner loop of integral. QUAD Numerically evaluate integral, low order method. QUAD8 Numerically evaluate integral, higher order method. COSINT Cosine integral function. SININT Sine integral function. ASSEMA Assembles area integral contributions in a PDE problem. COSINT Cosine integral function. FOURIER Fourier integral transform. IFOURIER Inverse Fourier integral transform. SININT Sine integral function.

2.9.4 其他起帮助作用的工具指令

2.9.5 专门的在线帮助窗

2.9.6 超文本形式的用户指南和指令手册

2.9.7 用户指南和指令手册的 PDF文件

2.10 文件管理

2.10.1 MATLAB的搜索路径

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 17: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

9

【例 2.10.1-1】sqrt是 MATLAB的内部函数。下面观察,当对 sqrt重新赋值后,所产生的不正常现象。 (1)正常运作情况 sqrt(2) ans =

1.4142 which sqrt sqrt is a built-in function. exist sqrt %当用 exist判断 sqrt时,显示结果“5”指明是内建函数。 ans = 5 (2)不正常运作 sqrt=[1, 0] %把 sqrt赋值成一个两个元素的行向量 sqrt = 1 0 sqrt(2) %这时该指令给出结果是 0,而不是正常的平方根值 1.4142 ans = 0 which sqrt %当用 which检查 sqrt在哪里时,显示的却是“内存变量” sqrt is a variable. exist sqrt %当用 exist判断 sqrt时,显示结果“1”指明是变量 ans = 1

2.10.2 用户目录的设置

2.10.3 MATLAB搜索路径的扩展和修改

2.10.3.1 利用 path 指令扩展搜索路径

2.10.3.2 利用路径浏览器修改搜索路径

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 18: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

1

3 数值数组及其运算

3.1 引导 【*例 3.1-1】绘制函数 xxey −= 在 10 ≤≤ x 时的曲线。

x=0:0.1:1 %定义自变量的采样点取值数组 y=x.*exp(-x) %利用数组运算计算各自变量采样点上的函数值 plot(x,y),xlabel('x'),ylabel('y'),title('y=x*exp(-x)') %绘图 x = Columns 1 through 7 0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 Columns 8 through 11 0.7000 0.8000 0.9000 1.0000 y = Columns 1 through 7 0 0.0905 0.1637 0.2222 0.2681 0.3033 0.3293 Columns 8 through 11 0.3476 0.3595 0.3659 0.3679

0 0.2 0.4 0.6 0.8 10

0.05

0.1

0.15

0.2

0.25

0.3

0.35

0.4

x

y

y=x*exp(-x)

图 3.1-1

3.2 一维数组的创建和寻访

3.2.1 一维数组的创建

3.2.2 一维数组的子数组寻访和赋值 【*例 3.2.2-1】子数组的寻访(Address)。 rand('state',0) %把均匀分布伪随机发生器置为 0状态

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 19: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

2

x=rand(1,5) %产生 )51( × 的均布随机数组 x =

0.9501 0.2311 0.6068 0.4860 0.8913

x(3) %寻访数组 x的第三个元素。 ans =

0.6068

x([1 2 5]) %寻访数组 x的第一、二、五个元素组成的子数组。 ans =

0.9501 0.2311 0.8913

x(1:3) %寻访前三个元素组成的子数组 ans = 0.9501 0.2311 0.6068 x(3:end) %寻访除前 2个元素外的全部其他元素。end是最后一个元素的下标。 ans = 0.6068 0.4860 0.8913 x(3:-1:1) %由前三个元素倒排构成的子数组 ans = 0.6068 0.2311 0.9501 x(find(x>0.5)) %由大于 0.5的元素构成的子数组 ans =

0.9501 0.6068 0.8913 x([1 2 3 4 4 3 2 1]) %对元素可以重复寻访,使所得数组长度允许大于原数组。 ans = Columns 1 through 7 0.9501 0.2311 0.6068 0.4860 0.4860 0.6068 0.2311 Column 8 0.9501 【*例 3.2.2-2】子数组的赋值(Assign)。 x(3) = 0 %把上例中的第三个元素重新赋值为 0 x = 0.9501 0.2311 0 0.4860 0.8913 x([1 4])=[1 1] %把当前 x数组的第一、四个元素都赋值为 1。 x = 1.0000 0.2311 0 1.0000 0.8913

3.3 二维数组的创建

3.3.1 直接输入法 【*例 3.3.1-1】在MATLAB环境下,用下面三条指令创建二维数组 C。 a=2.7358; b=33/79; %这两条指令分别给变量 a ,b 赋值。 C=[1,2*a+i*b,b*sqrt(a);sin(pi/4),a+5*b,3.5+i] %这指令用于创建二维数组 C C = 1.0000 5.4716 + 0.4177i 0.6909

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 20: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

3

0.7071 4.8244 3.5000 + 1.0000i 【*例 3.3.1-2】复数数组的另一种输入方式。 M_r=[1,2,3;4,5,6],M_i=[11,12,13;14,15,16] CN=M_r+i*M_i %由实部、虚部数组构成复数数组 M_r = 1 2 3 4 5 6 M_i = 11 12 13 14 15 16 CN = 1.0000 +11.0000i 2.0000 +12.0000i 3.0000 +13.0000i 4.0000 +14.0000i 5.0000 +15.0000i 6.0000 +16.0000i

3.3.2 利用M文件创建和保存数组 【例 3.3.2-1】创建和保存数组 AM的 MyMatrix.m 文件。 % MyMatrix.m Creation and preservation of matrix AM AM=[101,102,103,104,105,106,107,108,109;... 201,202,203,204,205,206,207,208,209;... 301,302,303,304,305,306,307,308,309];

3.4 二维数组元素的标识

3.4.1 “全下标”标识

3.4.2 “单下标”标识

3.4.3 “逻辑 1”标识

【*例 3.4.3-1】找出数组

−−−−

=5311342024

A 中所有绝对值大于 3的元素。

A=zeros(2,5); %预生成一个(2*5)全零数组 A(:)=-4:5 %运用“全元素”赋值法获得 A L=abs(A)>3 %产生与 A同维的“0-1”逻辑值数组 islogical(L) %判断 L是否逻辑值数组。输出若为 1,则是。 X=A(L) %把 L中逻辑值 1对应的 A元素取出 A = -4 -2 0 2 4 -3 -1 1 3 5 L = 1 0 0 0 1 0 0 0 0 1 ans = 1 X =

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 21: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

4

-4 4 5 【*例 3.4.3-2】演示逻辑数组与一般双精度数值数组的关系和区别。(本例在例 3.4.3-1基础上进行)。 (1)逻辑数组与双精度数组的相同之处 Num=[1,0,0,0,1;0,0,0,0,1]; %产生与 L数组外表完全相同的“双精度数组” N_L=Num==L %假如 Num与 L数值相等,则应得 1 。 c_N=class(Num) %用 class指令检查 Num的类属 c_L=class(L) %用 class指令检查 L的类属 N_L = 1 1 1 1 1 1 1 1 1 1 c_N = double c_L = double (2)逻辑数组与一般双精度数组的差别 islogical(Num) %检查 Num是否属于逻辑数组类 Y=A(Num) %试探 Num能否象 L一样具有标识作用 ans = 0 ??? Index into matrix is negative or zero. See release notes on changes to logical indices.

3.5 二维数组的子数组寻访和赋值 【*例 3.5-1】不同赋值方式示例。 A=zeros(2,4) %创建 )42( × 的全零数组 A = 0 0 0 0 0 0 0 0 A(:)=1:8 %全元素赋值方式 A = 1 3 5 7 2 4 6 8 s=[2 3 5]; %产生单下标数组行数组 A(s) %由“单下标行数组”寻访产生 A元素组成的行数组 Sa=[10 20 30]' %Sa是长度为 3的“列数组” A(s)=Sa %单下标方式赋值 ans = 2 3 5 Sa = 10 20 30 A = 1 20 30 7

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 22: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

5

10 4 6 8 A(:,[2 3])=ones(2) %双下标赋值方式:把 A的第 2、3列元素全赋为 1 A = 1 1 1 7

10 1 1 8

3.6 执行数组运算的常用函数

3.6.1 函数数组运算规则的定义:

3.6.2 执行数组运算的常用函数 【*例 3.6.2-1】演示 pow2的数组运算性质。 A=[1:4;5:8] %生成 )42( × 数组 A = 1 2 3 4 5 6 7 8 pow2(A) %计算 ][22 ijaA = 的结果也是 )42( × 数组 ans = 2 4 8 16

32 64 128 256

3.7 数组运算和矩阵运算

3.7.1 数组运算和矩阵运算指令对照汇总 【*例 3.7.1-1】两种不同转置的比较 clear;A=zeros(2,3); A(:)=1:6; %全元素赋值法 A=A*(1+i) %运用标量与数组乘产生复数矩阵 A_A=A.' %数组转置,即非共轭转置 A_M=A' %矩阵转置,即共轭转置 A = 1.0000 + 1.0000i 3.0000 + 3.0000i 5.0000 + 5.0000i 2.0000 + 2.0000i 4.0000 + 4.0000i 6.0000 + 6.0000i A_A = 1.0000 + 1.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i 4.0000 + 4.0000i 5.0000 + 5.0000i 6.0000 + 6.0000i A_M = 1.0000 - 1.0000i 2.0000 - 2.0000i 3.0000 - 3.0000i 4.0000 - 4.0000i 5.0000 - 5.0000i 6.0000 - 6.0000i

3.8 多项式的表达方式及其操作

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 23: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

6

3.8.1 多项式的表达和创建

3.8.1.1 多项式表达方式的约定

3.8.1.2 多项式行向量的创建方法 【*例 3.8.1.2-1】求 3阶方阵 A的特征多项式。 A=[11 12 13;14 15 16;17 18 19]; PA=poly(A) %A的特征多项式 PPA=poly2str(PA,'s') %以较习惯的方式显示多项式 PA = 1.0000 -45.0000 -18.0000 -0.0000 PPA = s^3 - 45 s^2 - 18 s - 2.8387e-015 【*例 3.8.1.2-2】由给定根向量求多项式系数向量。 R=[-0.5,-0.3+0.4*i,-0.3-0.4*i]; %根向量 P=poly(R) %R的特征多项式 PR=real(P) %求 PR的实部 PPR=poly2str(PR,'x') P = 1.0000 1.1000 0.5500 0.1250 PR = 1.0000 1.1000 0.5500 0.1250 PPR = x^3 + 1.1 x^2 + 0.55 x + 0.125

3.8.2 多项式运算函数

【*例 3.8.2-1】求1

)1)(4)(2(3

2

+++++

sssss

的“商”及“余”多项式。

p1=conv([1,0,2],conv([1,4],[1,1])); %计算分子多项式 p2=[1 0 1 1]; %注意缺项补零 [q,r]=deconv(p1,p2); cq='商多项式为 '; cr='余多项式为 '; disp([cq,poly2str(q,'s')]),disp([cr,poly2str(r,'s')]) 商多项式为 s + 5 余多项式为 5 s^2 + 4 s + 3 【*例 3.8.2-2】两种多项式求值指令的差别。 S=pascal(4) %生成一个 4阶方阵 P=poly(S);PP=poly2str(P,'s') PA=polyval(P,S) %独立变量取数组 S元素时的多项式值 PM=polyvalm(P,S) %独立变量取矩阵 S时的多项式值 S = 1 1 1 1 1 2 3 4 1 3 6 10 1 4 10 20 PP = s^4 - 29 s^3 + 72 s^2 - 29 s + 1 PA =

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 24: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

7

1.0e+004 * 0.0016 0.0016 0.0016 0.0016 0.0016 0.0015 -0.0140 -0.0563 0.0016 -0.0140 -0.2549 -1.2089 0.0016 -0.0563 -1.2089 -4.3779 PM = 1.0e-011 * -0.0077 0.0053 -0.0096 0.0430 -0.0068 0.0481 -0.0110 0.1222 0.0075 0.1400 -0.0095 0.2608 0.0430 0.2920 -0.0007 0.4737 【*例 3.8.2-3】部分分式展开。 a=[1,3,4,2,7,2]; %分母多项式系数向量 b=[3,2,5,4,6]; %分子多项式系数向量 [r,s,k]=residue(b,a) r = 1.1274 + 1.1513i 1.1274 - 1.1513i -0.0232 - 0.0722i -0.0232 + 0.0722i 0.7916 s = -1.7680 + 1.2673i -1.7680 - 1.2673i 0.4176 + 1.1130i 0.4176 - 1.1130i -0.2991 k = []

3.9 标准数组生成函数和数组操作函数

3.9.1 标准数组生成函数 【*例 3.9.1-1】标准数组产生的演示。 ones(1,2) %产生长度为 2的全 1行数组 ans = 1 1 ones(2) %产生 )22( × 的全 1阵 ans = 1 1 1 1 randn('state',0) %把正态随机数发生器置 0 randn(2,3) %产生 )32( × 的正态随机阵 ans = -0.4326 0.1253 -1.1465 -1.6656 0.2877 1.1909 D=eye(3) %产生 )33( × 的单位阵 D = 1 0 0

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 25: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

8

0 1 0 0 0 1 diag(D) %取 D阵的对角元 ans = 1 1 1 diag(diag(D)) %内 diag取 D的对角元,外 diag利用一维数组生成对角阵 ans = 1 0 0 0 1 0 0 0 1 repmat(D,1,3) %在水平方向“铺放”三个 D阵 ans = 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1

3.9.2 数组操作函数 【*例 3.9.2-1】diag与 reshape的使用演示。 a=-4:4 %产生一维数组 A=reshape(a,3,3) %把一维数组 a重排成 )33( × 的二维数组 a = -4 -3 -2 -1 0 1 2 3 4 A = -4 -1 2 -3 0 3 -2 1 4 a1=diag(A,1) %取 A阵“第一上对角线”的元素 a1 = -1 3 A1=diag(a1,-1) %产生以 a1数组元素为“第一下对角线”元素的二维数组 A1 = 0 0 0 -1 0 0 0 3 0 【*例 3.9.2-2】数组转置、对称交换和旋转操作后果的对照比较。 A A = -4 -1 2 -3 0 3 -2 1 4 A.' %转置 ans = -4 -3 -2 -1 0 1 2 3 4

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 26: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

9

flipud(A) %上下对称交换 ans = -2 1 4 -3 0 3 -4 -1 2 fliplr(A) %左右对称交换 ans = 2 -1 -4 3 0 -3 4 1 -2 rot90(A) %逆时针旋转 90度 ans = 2 3 4 -1 0 1 -4 -3 -2 【*例 3.9.2-3】演示 Kronecker乘法不具备“可交换规律”。 B=eye(2) %产生 )22( × 单位阵 C=reshape(1:4,2,2) %利用重组操作产生 )22( × 矩阵 B = 1 0 0 1 C = 1 3 2 4 kron(B,C) ans = 1 3 0 0 2 4 0 0 0 0 1 3 0 0 2 4 kron(C,B) ans = 1 0 3 0 0 1 0 3 2 0 4 0 0 2 0 4

3.10 数组构作技法综合 【*例 3.10-1】数组的扩展。 (1)数组的赋值扩展法 A=reshape(1:9,3,3) %创建 )33( × 数组 A A = 1 4 7 2 5 8 3 6 9 A(5,5)=111 %扩展为 )55( × 数组。扩展部分除(5,5)元素为 111外,其余均为 0。

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 27: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

10

A = 1 4 7 0 0 2 5 8 0 0 3 6 9 0 0 0 0 0 0 0 0 0 0 0 111 A(:,6)=222 %标量对子数组赋值,并扩展为 )65( × 数组。 A = 1 4 7 0 0 222 2 5 8 0 0 222 3 6 9 0 0 222 0 0 0 0 0 222 0 0 0 0 111 222 (2)多次寻访扩展法 AA=A(:,[1:6,1:6]) %相当于指令 repmat(A,1,2),读者可以试试。 AA = 1 4 7 0 0 222 1 4 7 0 0 222 2 5 8 0 0 222 2 5 8 0 0 222 3 6 9 0 0 222 3 6 9 0 0 222 0 0 0 0 0 222 0 0 0 0 0 222 0 0 0 0 111 222 0 0 0 0 111 222 (3)合成扩展法 B=ones(2,6) %创建 )62( × 全 1数组 B = 1 1 1 1 1 1 1 1 1 1 1 1 AB_r=[A;B] %行数扩展合成 AB_r = 1 4 7 0 0 222 2 5 8 0 0 222 3 6 9 0 0 222 0 0 0 0 0 222 0 0 0 0 111 222 1 1 1 1 1 1 1 1 1 1 1 1 AB_c=[A,B(:,1:5)'] %列数扩展合成 AB_c = 1 4 7 0 0 222 1 1 2 5 8 0 0 222 1 1 3 6 9 0 0 222 1 1 0 0 0 0 0 222 1 1 0 0 0 0 111 222 1 1 【*例 3.10-2】提取子数组,合成新数组。 A %重显 A数组 A = 1 4 7 0 0 222 2 5 8 0 0 222 3 6 9 0 0 222 0 0 0 0 0 222 0 0 0 0 111 222 AB_BA=triu(A,1)+tril(A,-1) %利用操作函数,使主对角元素为全 0 AB_BA =

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 28: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

11

0 4 7 0 0 222 2 0 8 0 0 222 3 6 0 0 0 222 0 0 0 0 0 222 0 0 0 0 0 222 AB1=[A(1:2,end:-1:1);B(1,:)] %灵活合成 AB1 = 222 0 0 7 4 1 222 0 0 8 5 2 1 1 1 1 1 1 【*例 3.10-3】单下标寻访和 reshape指令演示。 clear %清除内存变量 A=reshape(1:16,2,8) %变一维数组成 )82( × 数组 A = 1 3 5 7 9 11 13 15 2 4 6 8 10 12 14 16 reshape(A,4,4) %变 )82( × 数组为 )44( × 数组 ans = 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16 s=[1 3 6 8 9 11 14 16]; %定义“单下标”数组 A(s)=0 %利用“单下标”数组对 A的元素重新赋值 A = 0 0 5 7 0 0 13 15 2 4 0 0 10 12 0 0 【*例 3.10-4】“对列(或行)同加一个数”三种的操作方法。 clear,A=reshape(1:9,3,3) A = 1 4 7 2 5 8 3 6 9 b=[1 2 3];A_b1=A-b([1 1 1],:) %使 A的第 1,2,3行分别减 b向量[1 2 3] A_b1 = 0 2 4 1 3 5 2 4 6 A_b2=A-repmat(b,3,1) A_b2 = 0 2 4 1 3 5 2 4 6 A_b3=[A(:,1)-b(1),A(:,2)-b(2),A(:,3)-b(3)] A_b3 = 0 2 4 1 3 5 2 4 6

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 29: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

12

【*例 3.10-5】逻辑函数的运用示例。 randn('state',1),R=randn(3,6) %创建正态随机阵 R = 0.8644 0.8735 -1.1027 0.1684 -0.5523 -0.6149 0.0942 -0.4380 0.3962 -1.9654 -0.8197 -0.2546 -0.8519 -0.4297 -0.9649 -0.7443 1.1091 -0.2698 L=abs(R)<0.5|abs(R)>1.5 %不等式条件运算,结果给出逻辑数组 L = 0 0 0 1 0 0 1 1 1 1 0 1 0 1 0 0 0 1 R(L)=0 %“逻辑 1”对应的元素赋 0值。 R = 0.8644 0.8735 -1.1027 0 -0.5523 -0.6149 0 0 0 0 -0.8197 0 -0.8519 0 -0.9649 -0.7443 1.1091 0 s=(find(R==0))' %利用 find获得符合关系等式条件的元素“单下标” s = 2 5 6 8 10 11 17 18 R(s)=111 %利用“单下标”定位赋值 R = 0.8644 0.8735 -1.1027 111.0000 -0.5523 -0.6149 111.0000 111.0000 111.0000 111.0000 -0.8197 111.0000 -0.8519 111.0000 -0.9649 -0.7443 1.1091 111.0000 [ii,jj]=find(R<0); %利用 find获得符合关系等式条件的元素“双下标” disp(ii'),disp(jj') 3 1 3 3 1 2 1 1 3 3 4 5 5 6

3.11 高维数组

3.11.1 高维数组的创建 【*例 3.11.1-1】“全下标”元素赋值方式创建高维数组演示。 A(2,2,2)=1 %单元素赋值创建 )222( ×× 数组 A(:,:,1) = 0 0 0 0 A(:,:,2) = 0 0

0 1

B(2,5,:)=1:3 %子数组赋值创建 )352( ×× 数组 B(:,:,1) = 0 0 0 0 0 0 0 0 0 1 B(:,:,2) = 0 0 0 0 0 0 0 0 0 2

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 30: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

13

B(:,:,3) = 0 0 0 0 0 0 0 0 0 3 【*例 3.11.1-2】低维数组合成高维数组。 clear,A=ones(2,3);A(:,:,2)=ones(2,3)*2;A(:,:,3)=ones(2,3)*3 A(:,:,1) = 1 1 1 1 1 1 A(:,:,2) = 2 2 2 2 2 2 A(:,:,3) = 3 3 3 3 3 3 【*例 3.11.1-3】由函数 ones, zeros, rand, randn直接创建标准高维数组的示例。 rand('state',1111),rand(2,4,3) ans(:,:,1) = 0.6278 0.9748 0.2585 0.6949 0.2544 0.2305 0.0313 0.1223 ans(:,:,2) = 0.4889 0.3898 0.8489 0.0587 0.9138 0.3071 0.4260 0.6331 ans(:,:,3) = 0.2802 0.2073 0.7438 0.2714 0.4051 0.2033 0.4566 0.2421 【*例 3.11.1-4】借助 cat, repmat, reshape等函数构作高维数组。 (1)cat构作高维数组示例 cat(3,ones(2,3),ones(2,3)*2,ones(2,3)*3) ans(:,:,1) = 1 1 1 1 1 1 ans(:,:,2) = 2 2 2 2 2 2 ans(:,:,3) = 3 3 3 3 3 3 (2)repmat构作高维数组示例 repmat(ones(2,3),[1,1,3]) ans(:,:,1) = 1 1 1 1 1 1 ans(:,:,2) = 1 1 1 1 1 1 ans(:,:,3) = 1 1 1 1 1 1 (3)reshape构作高维数组示例

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 31: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

14

reshape(1:12,2,2,3) ans(:,:,1) = 1 3 2 4 ans(:,:,2) = 5 7 6 8 ans(:,:,3) = 9 11 10 12

3.11.2 高维数组的标识 【*例 3.11.2-1】维数、大小和长度 clear;A=reshape(1:24,2,3,4); dim_A=ndims(A) %测量 A的维数 size_A=size(A) %测量 A的大小 L_A=length(A) %求 A的长度 dim_A = 3 size_A = 2 3 4 L_A = 4

3.11.3 高维数组构作和操作函数汇总 【*例 3.11.3-1】数组元素对称交换指令 flipdim的使用示例。 A=reshape(1:18,2,3,3) %创建 3维数组 A(:,:,1) = 1 3 5 2 4 6 A(:,:,2) = 7 9 11 8 10 12 A(:,:,3) = 13 15 17 14 16 18 flipdim(A,1) %关于“行平分面”交换对称位置上的元素 ans(:,:,1) = 2 4 6 1 3 5 ans(:,:,2) = 8 10 12 7 9 11 ans(:,:,3) = 14 16 18 13 15 17 flipdim(A,3) %关于“页平分面”交换对称位置上的元素 ans(:,:,1) = 13 15 17 14 16 18 ans(:,:,2) = 7 9 11

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 32: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

15

8 10 12 ans(:,:,3) = 1 3 5 2 4 6 【*例 3.11.3-2】数组的“维序号左移”重组。 shiftdim(A,1) %“维号左移 1位”重组,使 )332( ×× 数组变成 )233( ×× 数组 ans(:,:,1) = 1 7 13 3 9 15 5 11 17 ans(:,:,2) = 2 8 14 4 10 16 6 12 18 shiftdim(A,2) %“维号左移 2位”重组,使 )332( ×× 数组变成 )323( ×× 数组 ans(:,:,1) = 1 2 7 8 13 14 ans(:,:,2) = 3 4 9 10 15 16 ans(:,:,3) = 5 6 11 12

17 18 【*例 3.11.3-3】广义非共轭转置。

permute(A,[2,3,1]) %相当于 shiftdim(A,1) ans(:,:,1) = 1 7 13 3 9 15 5 11 17 ans(:,:,2) = 2 8 14 4 10 16 6 12 18 permute(A,[1,3,2]) ans(:,:,1) = 1 7 13 2 8 14 ans(:,:,2) = 3 9 15 4 10 16 ans(:,:,3) = 5 11 17 6 12 18 【*例 3.11.3-4】“孤维”的撤消和降维。

B=cat(4,A(:,:,1),A(:,:,2),A(:,:,3)) %串接为 4维数组

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 33: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

16

B(:,:,1,1) = 1 3 5 2 4 6 B(:,:,1,2) = 7 9 11 8 10 12 B(:,:,1,3) = 13 15 17 14 16 18 size(B) %测量数组 B的大小 ans = 2 3 1 3 C=squeeze(B) %撤消长度为 1的“孤维”,使原 4维数组减为 3维数组。 C(:,:,1) = 1 3 5 2 4 6 C(:,:,2) = 7 9 11 8 10 12 C(:,:,3) = 13 15 17 14 16 18 size(C) ans = 2 3 3 【*例 3.11.3-5】赋“空阵”值操作。 A=reshape(1:18,2,3,3) %创建 3维数组 A(:,:,1) = 1 3 5 2 4 6 A(:,:,2) = 7 9 11 8 10 12 A(:,:,3) = 13 15 17 14 16 18 A(:,2:3,:)=[] %赋“空”,使原 A数组的第二、三列消失。 B=A; A(:,:,1) = 1 2 A(:,:,2) = 7 8 A(:,:,3) = 13 14 size(A) ans = 2 1 3 A_1=squeeze(A) %撤消“孤维”,数组由 3维降为 2维。 A_1 = 1 7 13

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 34: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

17

2 8 14 size(B) %B数组与 A同样存在“孤维” ans = 2 1 3 B(:,1,:)=[] %对“孤维”赋“空”,不能降维! B = Empty array: 2-by-0-by-3

3.12 “非数”和“空”数组

3.12.1 非数 NaN 【*例 3.12.1-1】非数的产生和性质演示。 (1)非数的产生 a=0/0,b=0*log(0),c=inf-inf Warning: Divide by zero. a = NaN Warning: Log of zero. b = NaN c = NaN (2)非数的传递性 0*a,sin(a) ans = NaN ans = NaN (3)非数的不可比较性 a==nan %该指令想计算“a等于非数吗?”。但不能给出正确的判断结果。 ans = 0 (4)非数不能进行关系运算 a~=nan %该指令“a不是非数吗?”,也不可能给出正确的判断结果。 a==b %两个非数不存在“等”与“不等”的概念 b>c %两个非数不能比较大小 ans = 1 ans = 0 ans = 0 (5)非数的属性判断 class(a) %数据类型归属 isnan(a) %该指令是唯一能正确判断非数的指令。

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 35: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

18

ans = double ans = 1 【*例 3.12.1-2】非数元素的寻访 %创建带非数的二维数组 rand('state',0) %将随机发生器置 0。目的是使读者便于把自己运算结果与本书对照。 R=rand(2,5);R(1,5)=NaN;R(2,3)=NaN R = 0.9501 0.6068 0.8913 0.4565 NaN 0.2311 0.4860 NaN 0.0185 0.4447 isnan(R) %对数组元素是否非数进行判断 ans = 0 0 0 0 1 0 0 1 0 0 %找出非数元素的位置标识 Linear_index=find(isnan(R)) %非数的“单下标”标识 [r_index,c_index]=ind2sub(size(R),Linear_index); %转换成“全下标”标识 disp('r_index c_index'),disp([r_index c_index]) Linear_index = 6 9 r_index c_index 2 3

1 5

3.12.2 “空”数组 【*例 3.12.2-1】关于“空”数组的算例。 (1)创建“空”数组的几种方法 a=[],b=ones(2,0),c=zeros(2,0),d=eye(2,0),f=rand(2,3,0,4) a = [] b = Empty matrix: 2-by-0 c = Empty matrix: 2-by-0 d = Empty matrix: 2-by-0 f = Empty array: 2-by-3-by-0-by-4 (2)“空”数组的属性 class(a) %“空”的数据类别 isnumeric(a) %是数值数组类吗 isempty(a) %唯一可正确判断数组是否“空”的指令 ans = double ans = 1 ans = 1

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 36: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

19

which a %变量 a是什么 ndims(a) %数组 a的维数 size(a) %a数组的大小 a is a variable. ans = 2 ans = 0 0 (3)“空”数组不具备一般的传递性 b_c1=b.*c %两个空阵的点乘 b_c2=b'*c %矩阵乘一。注意:生成矩阵为 0-by-0,故“空”。 b_c3=b*c' %矩阵乘二。注意:生成矩阵为 2-by-2。 b_c1 = Empty matrix: 2-by-0 b_c2 = [] b_c3 = 0 0 0 0 (4)“空”数组的比较要谨慎 a==b %结果解释不合理 Warning: [] == X is technically incorrect. Use isempty(X) instead. ans = 0 b==c %结果可合理解释为“无法比较” ans = Empty matrix: 2-by-0 c>d %结果可合理解释“无法比较” ans = Empty matrix: 2-by-0 a==0 %结果可解释为“不等于” Warning: Future versions will return empty for empty == scalar comparisons. ans = 0 a~=0 %结果解释为“是不等” Warning: Future versions will return empty for empty ~= scalar comparisons. ans = 1 (5)没有“空”数组参与运算时,结果中的“空”有合理的解释 A=reshape(-4:5,2,5) %创建一个数值数组 A A = -4 -2 0 2 4 -3 -1 1 3 5 L2=A>10 %检查 A中大于 10的元素位置 find(L2) %找出 L2逻辑数组中非 0元素的“单下标”标识。 L2 =

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 37: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

20

0 0 0 0 0 0 0 0 0 0 ans = [] (6)“空”数组用于子数组的删除和大数组的维数收缩(参见例 3.11.3-5) A(:,[2,4])=[] %删除 A的第二、四列 A = -4 0 4 -3 1 5

3.13 关系操作和逻辑操作

3.13.1 关系操作 【*例 3.13.1-1】关系运算示例。 A=1:9,B=10-A,r0=(A<4),r1=(A==B) A = 1 2 3 4 5 6 7 8 9 B = 9 8 7 6 5 4 3 2 1 r0 = 1 1 1 0 0 0 0 0 0 r1 = 0 0 0 0 1 0 0 0 0 【*例 3.13.1-2】关系运算运用之一:求近似极限,修补图形缺口。 t=-2*pi:pi/10:2*pi; %该自变量数组中,存在 0值。 y=sin(t)./t; %在 t=0处,按 IEEE规则,计算将产生 NaN tt=t+(t==0)*eps; %逻辑数组参与运算,使 0元素被一个“机器零”小数代替。 yy=sin(tt)./tt; %用数值可算的 sin(eps)/eps近似替代 sin(0)/0极限. subplot(1,2,1),plot(t,y),axis([-7,7,-0.5,1.2]), xlabel('t'),ylabel('y'),title('残缺图形') subplot(1,2,2),plot(tt,yy),axis([-7,7,-0.5,1.2]) xlabel('t'),ylabel('yy'),title('正确图形') Warning: Divide by zero.

-5 0 5

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

1.2

t

y

残缺图形

-5 0 5

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

1.2

t

yy

正 确图形

图 3.13.2-2 极限处理前后的图形对照

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 38: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

21

3.13.2 逻辑操作 【*例 3.13.2-1】逻辑操作示例。 A=1:9,L1=~(A>5) %判断 A中,哪些元素不大于 5 L2=(A>3)&(A<7) %判断 A中,哪些元素大于 3小于 7 A = 1 2 3 4 5 6 7 8 9 L1 = 1 1 1 1 1 0 0 0 0 L2 = 0 0 0 1 1 1 0 0 0 【*例 3.13.2-2】逻辑操作应用之一:逐段解析函数的计算和表现。本例演示削顶整流正弦半波的计算和图形绘制。 t=linspace(0,3*pi,500);y=sin(t);%产生正弦波 %处理方法一:从自变量着手进行逐段处理。 z1=((t<pi)|(t>2*pi)).*y; %获得整流半波 <3> w=(t>pi/3&t<2*pi/3)+(t>7*pi/3&t<8*pi/3);%关系逻辑运算和数值运算 <4> w_n=~w; % <5> z2=w*sin(pi/3)+w_n.*z1; %获得削顶整流半波 <6> subplot(1,3,1),plot(t,y,':r'),ylabel('y') subplot(1,3,2),plot(t,z1,':r'),axis([0 10 -1 1]) subplot(1,3,3),plot(t,z2,'-b'),axis([0 10 -1 1])

0 5 10-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

y

0 5 10-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

0 5 10-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

图 3.13.2-1 逐段解析函数的产生

%处理方法二:从函数量着手进行逐段处理。 z=(y>=0).*y; %正弦整流半波 <11> a=sin(pi/3); z=(y>=a)*a+(y<a).*z; %削顶的正弦整流半波 <13> plot(t,y,':r');hold on;plot(t,z,'-b') xlabel('t'),ylabel('z=f(t)'),title('逐段解析函数') legend('y=sin(t)','z=f(t)'),hold off

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn

Page 39: 1.1 MATLAB 的发展历程和影响read.pudn.com/downloads151/ebook/656278/ch03.pdf · 诚然,到1999年底,Mathematica 也已经升到4.0 版,它特别加强了以前欠缺的大规模

22

图 3.13.2-2 逐段解析函数的生成和表现

3.13.3 关系、逻辑函数

PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn