MATLAB小波分析超级学习手册(txt+pdf+epub+mobi电子书下载)


发布时间:2020-05-11 02:41:12

点击下载

作者:MATLAB技术联盟,孔玲军(编著)

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

MATLAB小波分析超级学习手册

MATLAB小波分析超级学习手册试读:

前言

本书主要针对MATLAB R2013a中的小波工具箱进行详细的介绍。小波分析是在传统傅立叶分析和短时傅立叶分析的基础上产生的,不但具有局部化时频分析能力,而且时间分辨率和频率分辨率均可以调整,非常适合分析非平稳信号,目前在语音、图像、图形、通信、地震、生物医学、机械振动、计算机视觉等领域都有很好的应用。

小波分析包含了丰富的数学内容,并推动了泛函分析、调和分析理论的发展,同时,在诸如图像压缩、信号去噪、自适应滤波、数值分析和物理学等领域得到了广泛的应用,是当前最为活跃的应用研究领域之一,并逐渐形成为一门极具有生命力的新学科。

MATLAB软件在算法开发、数据采集、数学建模、数学计算、系统仿真、数据分析和工程绘图等方面因其实用性和易操作性而具有独特的优势。

秉承小波与MATLAB各自的特点,作者在撰写本书的过程中始终平衡着各种层次的小波学习者。在本书的全面介绍下,无论读者是否使用过MATLAB软件,都可轻松解决小波处理信号与图像等方面的问题。

1.本书特点

由浅入深,循序渐进。本书以初、中级读者为对象,首先从MATLAB使用基础讲起,接着叙述小波分析的相关知识,配合MATLAB相关实例进行讲解,最后综合介绍MATLAB的一些实际应用。

内容详实,涉及广泛。本书较为全面地包含了小波分析在数字信号和图像处理等多个领域上的应用,甚至涉及了小波分析在统计中的应用,内容新颖。本书在讲解的过程中,章节安排合理,既注重理论研究,又加强在实际中的应用,使读者能快速掌握书中内容。

实例经典,轻松易学。通过学习实际工程应用案例的具体操作是掌握MATLAB最好的方式。在本书的后9章通过综合应用案例,透彻详尽地讲解了MATLAB在小波分析中各方面的应用。

2.本书内容

本书基于MATLAB 2013a,讲解了MATLAB的基础知识和在小波分析中的应用,向读者提供精通小波分析与MATLAB所需的必要方法。对于本书的大部分内容,读者通过简单操作即可使用。本书在结构上具体安排如下。

前两章为第一部分,是有关MATLAB R2013a基础方面的内容。

第1章介绍了MATLAB的基本功能,包括MATLAB开发环境、编程语法、数据类型及M文件等,这些MATLAB中的基本功能是操作基础,同时也是小波实现的必备知识。

第2章介绍了高级用户界面接口GUI,其中包括句柄、GUI概述、GUI的编写流程以及GUI设计实例等,这些内容会使读者对小波工具箱的认识向更高的目标迈进。

接下来的6章为第二部分,主要介绍了小波分析的基础知识。

第3章介绍了预备知识,包括傅立叶变换、Z变换及MATLAB的相关函数以及数字滤波器等,这些内容主要是学习小波分析的基础内容,读者可以适当选读。

第4章介绍了连续小波变换,包括小波分析的发展过程、连续小波变换的基本数学概念和连续小波的计算与其反变换的应用,还有就是重点介绍了MATLAB提供的连续小波工具箱等。

第5章介绍了离散小波变换,包括一维离散小波变换的基本数学概念、小波框架、离散小波反变换和其计算过程与方法,以及MATLAB提供的离散小波工具箱(一维离散小波界面和二维离散小波界面式操作)等。

第6章介绍了经典的多分辨分析理论及其Mallat算法,其中包括多分辨分析的基本概念、几种常见的正交小波基、尺度函数和小波函数的基本性质、双尺度方程与多分辨滤波器组、Mallat算法及其在MATLAB中的实现方法、离散序列的多分辨分析,以及二维正交小波变换等。

第7章介绍了小波基函数及其构造,其中包括8种常见小波和小波的性质、MATLAB对小波基的命名方式,以及小波基的构造方法与提升法构造二代小波等。

第8章介绍了小波包分析及其应用,其中包括小波包分析的概念、性质与算法,以及MATLAB提供的小波包工具箱与小波包分析的综合应用实例等。

第三部分共4章,主要介绍了小波分析在信号处理方面的应用。

第9章介绍了小波分析用于信号滤波的内容,主要包括信号滤波的概念,以及滤波器的设计与滤波函数的MATLAB使用方法。

第10章介绍了小波分析用于信号去噪的内容,其中包括小波变换与小波包去噪方法,这其中主要介绍了阈值法,同时也例举了信号去噪方面的实例。

第11章介绍了小波分析用于信号压缩的内容,包括小波用于信号压缩实现方法、小波工具箱压缩方法及MATLAB提供小波函数进行压缩,以及小波压缩的综合实例。

第12章介绍了小波分析用于信号识别与检测的内容,其中包括信号的奇异性检测与信号边缘检测、信号的间断点检测、信号的自相似检测,还有信号特征提取以及模态参数识别。

第四部分主要介绍了小波用于图像处理方面的应用。

第13章介绍了小波分析用于图像去噪的内容,其中包括小波变换与小波包图像去噪方法,以及MATLAB提供小波函数进行图像去噪和小波图像去噪的综合实例等。

第14章介绍了小波分析用于图像压缩的内容,包括图像压缩技术、小波工具箱压缩方法及MATLAB提供小波函数进行图像压缩等。

第15章介绍了小波分析用于图像增强的内容,包括图像的钝化、锐化、增强及平滑,以及MATLAB提供小波函数进行图像增强的实例等。

第16章介绍了小波分析用于其他图像处理领域的应用,其中包括图像融合、小波包图像融合技术、图像分解及图像特征提取等。

第五部分讲解的是小波分析与统计分析的相关内容。

第17章介绍了小波分析用于样本估计的内容,是小波分析与统计分析相融合的内容,包括小波分析用于密度估计与回归估计,并且介绍了MATLAB的两类估计方法的小波工具箱。

3.读者对象

本书结构合理、叙述详细、实例丰富,适合于MATLAB小波分析工具箱的初学者和期望学习小波分析工具箱高级仿真技术的读者,具体说明如下:

★MATLAB及小波分析应用的爱好者

★广大科研工作人员

★从事图像处理的技术人员

★从事数字信号处理的技术人员

★大、中专院校的教师和在校生

★相关培训机构的教师和学员

★参加工作实习的“菜鸟”

在使用本书时,对MATLAB有一定基础的读者,可以从第3章学起;对MATLAB还略显生疏的读者,可按顺序学习。书中用到的程序代码和数据,请到作者博客下载。无论怎样,我们的目的就是希望您能体会到此书的方便性和实用性。

4.本书作者

本书由MATLAB技术联盟孔玲军编著,另外李昕、刘成柱、史洁玉、孙国强、代晶、贺碧蛟、石良臣、柯维娜等人为本书的编写提供了大量的帮助,在此一并表示感谢。

由于本书篇章布局以及编者水平受限,对小波分析在其他领域的应用并没有过多涉猎,虽然编者在本书的编写过程中力求叙述准确、完善,但由于水平有限,书中欠妥之处在所难免,希望读者能够及时指出,共同促进本书质量的提高。

5.读者服务

为了方便解决本书疑难问题,读者朋友在学习过程中遇到与本书有关的技术问题,可以发邮件到邮箱book_hai@126.com,或者访问博客http://blog.sina.com.cn/tecbook,编者会尽快给予解答,我们将竭诚为您服务。

编者▶▶第1章MATLAB基础

MATLAB是一款专业的商业计算机软件开发工具,设计之初主要应用于工程科学中的数学运算,后来它又渐渐发展成了通用科技计算、图视交互系统和程序语言,由于其日益完善逐渐发展成为一种极其灵活的计算体系,用于解决各种重要的技术问题。

本章首先简要介绍MATLAB软件所要实现的功能及特点、MATLAB软件的基本组成结构,其中包括目录结构、工作环境和系统帮助。1.3节是让广大MATLAB软件的初学者了解MATLAB的基本运算功能并例举了示例以及MATLAB编程语句。最后,介绍了数据类型及M文件的操作。

学习目标:

(1)掌握通用命令

(2)熟练掌握编程语句

(3)熟练掌握MATLAB数据类型

(4)熟练掌握M文件1.1 MATLAB简介

20世纪80年代,美国新墨西哥大学计算机科学系主任Cleve Moler教授使用FORTRAN编写了一组用于调用LINPACK和EISPACK程序库的接口,用于矩阵、线性代数和数值分析,这就是MATLAB。它是取MATrix LABoratory(矩阵实验室)两个单词的前3个字符组合而成。它是一种科学计算软件,专门以矩阵的形式处理数据。

随后,斯坦福大学的Jack Little 使用C重写MATLAB内核,使得软件兼具数值分析和数据可视化两大功能,并成立了MathWorks公司,将MATLAB软件商业化并推向市场。MATLAB支持UNIX、Linux、Windows多种操作平台系统。

如今,MATLAB已经成为具备计算机程序设计语言(Computer Programming Language)和交互软件环境(an Interactive Software Environment)的高效率的计算机语言。它将高性能的数值计算和可视化集成在一起,并提供了大量的内置函数,从而被广泛地应用于科学计算、控制系统、信息处理等领域的分析、仿真和设计工作,而且利用MATLAB产品的开放式结构可以非常容易地对MATLAB的功能进行扩充,从而在不断深化对问题认识的同时,不断完善MATLAB产品以提高产品自身的竞争能力。

目前,MATLAB产品族广泛应用于:数值分析;数值和符号计算;工程与科学绘图;图形用户界面设计、控制系统的设计与仿真;数字图像处理;数字信号处理;通信系统设计与仿真;财务与金融工程等领域。

MATLAB的一个重要特色就是它有一套程序扩展系统和一组称之为工具箱(Toolboxes)的特殊应用子程序。工具箱是MATLAB函数的子程序库,每一个工具箱都是为某一类学科专业和应用而定制的,主要包括信号处理、控制系统、神经网络、模糊逻辑、小波分析和系统仿真等方面的应用。

MATLAB程序执行MATLAB语言,并提供了一个极其广泛的预定义函数库,这样就使得技术工作变得简单高效。MATLAB是一个庞大的程序,拥有难以置信的各种丰富的函数,即使是基本版本的MATLAB语言,其拥有的函数也比其他的工程编程语言要丰富得多。基本的MATLAB语言已经拥有超过1 000的函数。

MATLAB主包和各种可选的toolbox工具包主要有数百个核心内部函数。迄今三十几个工具包分为两类功能性工具包和学科性工具包。

(1)功能性工具包主要用来扩充MATLAB的符号计算功能、图视建模仿真功能、文字处理功能以及硬件实时交互功能,这种功能性工具包用于多种学科。

(2)学科性工具包是专业性比较强的工具包,如控制工具包(Control Toolbox)、信号处理工具包(SignalProcessing Toolbox)、通信工具包(Communication Toolbox)和小波工具包(Wavelet Toolbox)等都属此类工具包。

也许MATLAB最重要、最受人欢迎的特点是:除内部函数外,所有MATLAB主包文件和各工具包文件都是可读可改的源文件,用户可通过对源文件的修改或加入自己的编写文件去构成新的专用工具包。

本书无意将MATLAB的所有函数和工具包介绍给大家,而是让大家在学习小波分析的基本内容的同时,通过MATLAB软件提供的小波工具包来实现小波的各种应用,从而辅助读者编写和调试相应的程序,帮助读者了解小波,用好小波。并且在学习小波的同时,将MATLAB小波工具包中提供的函数融会贯通。1.2 MATLAB组成结构

本节着重介绍MATLAB的组成体系,主要包括目录结构、工作环境和帮助系统,从感观上了解MATLAB软件的界面和环境。1.2.1 目录结构

当用户成功安装MATLAB时,在用户所选择的安装目录下将包含如表1-1所示的文件夹目录。表1-1 MATLAB的目录结构续表1.2.2 工作环境

本节通过介绍MATLAB工作环境界面,使读者初步掌握MATLAB软件的基本操作方法。

MATLAB的工作界面主要由选项卡、命令窗口、历史命令窗口、当前工作目录窗口和工作空间管理窗口组成,如图1-1(a)所示。单击选项卡右侧的按钮,此时选项卡菜单关闭,如图1-1(b)所示。

1.选项卡

MATLAB的界面与 Windows 程序的界面类似,用户只要稍加实践就可掌握其功能和使用方法。选项卡的内容会随着在命令窗口中执行不同命令而作出相应改变。这里只简单介绍图1-1中所示的3个主要的选项卡。图1-1 MATLAB工作环境图1-1 MATLAB工作环境(续)

(1)HOME选项卡,常用的选项主要有以下几种。

•FILE 面板,主要命令如下。

New Script:新建脚本文件。

•VARIABLE 面板,主要命令如下。

Save Workspace:将工作空间的变量存储在某一文件中。

Import Data:用于向工作空间导入数据。

•ENVIRONMENT 面板,主要命令如下。

Set Path:打开环境设置对话框,如图1-2所示。图1-2 Set Path对话框

Preferences:打开环境设置对话框,如图1-3所示。

•CODE 面板:用于设置调试程序。

•RESOURCES 面板,主要命令如下。图1-3 Preferences对话框

Help面板:用于选择打开不同的帮助系统,如图1-4所示。图1-4 Help面板

(2)PLOTS选项卡:用于画图的选项卡。单击主窗口第二个按钮,可以直接打开各种MATLAB画图工具,并且还有相应的画图命令,如图1-5所示。

(3)APPS选项卡:工具箱选项。单击窗口上的第三个按钮,可以直接打开各种MATLAB的工具箱。

2.命令窗口

MATLAB的命令窗口中的“>>”为运算提示符,表示MATLAB处于准备状态。当在提示符后输入一段程序或一段运算式后按Enter键,MATLAB会给出计算结果,并再次进入准备状态(所得结果将被保存在工作空间管理窗口中)。图1-5 PLOTS菜单

单击命令窗口右上角的按钮,可以使命令窗口脱离主窗口而成为一个独立的窗口,如图1-6所示。图1-6 命令窗口

在该窗口中选中某一表达式,然后右击,弹出如图1-7所示的上下文菜单,通过不同的选项可以对选中的表达式进行相应的操作。图1-7 命令窗口的上下文菜单

3.历史命令窗口

该窗口主要用于记录所有执行过的命令,在默认设置下,该窗口会保留自安装后所有使用过的命令的历史记录,并标明使用时间。同时,用户可以通过双击某一历史命令来重新执行该命令。与命令窗口类似,该窗口也可以成为一个独立的窗口。

在该窗口中选中某历史记录,然后右击,弹出如图1-8所示的上下文菜单。通过上下文菜单,用户可以删除或粘贴历史记录;也可为选中的表达式或命令创建一个M文件;还可为某一句或某一段表达式或命令创建快捷按钮,具体方法见下面的示例。

选择图1-8中的Create Shortcut命令,弹出如图1-9所示的Shortcut Editor对话框(“快捷键设置”对话框)。图1-8 历史命令窗口的上下文菜单图1-9 Shortcut Editor对话框

按照图1-9所示内容进行快捷键的设置,然后单击Save按钮,注意观察工具栏SHORTCUTS栏的变化,如图1-10所示。图1-10 创建新的快捷键

单击新加入的快捷按钮,命令窗口中会显示相应命令执行的结果。

用户还可以直接按住鼠标左键不放,将所选中的历史命令直接拖到SHORTCUTS栏中,这样也可为所选命令创建快捷键。

4.当前工作目录窗口

在目录窗口中可显示或改变当前目录,还可以显示当前目录下的文件以及搜索功能。与命令窗口类似,该窗口也可以成为一个独立的窗口,如图1-11所示。

5.工作空间管理窗口

在工作空间管理窗口中将显示目前内存中所有的MATLAB变量的变量名、数据结构、字节数以及类型等信息,不同的变量类型分别对应不同的变量名图标,如图1-12所示。图1-11 当前工作目录窗口图1-12 工作空间管理窗口1.2.3 系统帮助

MATLAB为用户提供了非常完善的帮助系统,例如,MATLAB的在线帮助、帮助窗口、帮助提示、HTML格式的帮助、pdf格式的帮助文件以及MATLAB的示例和演示等。

通过使用MATLAB的帮助菜单或在命令窗口中输入帮助命令,可以很容易地获得MATLAB的帮助信息,并能通过帮助进一步学习MATLAB。下面分别介绍MATLAB中3种类型的帮助系统。

1.命令窗口查询帮助系统

常见的帮助命令如表1-2所示。表1-2 常用MATLAB帮助命令

help命令:在命令窗口用于显示MATLAB函数的帮助。调用格式如下:

help             //在命令窗口列出所有主要的基本帮助主题

help /             //列出所有运算符和特殊字符

help functionname        //在命令窗口列出 functionnameM文件的描述及语法

help toolboxname        //在命令窗口列出 toolboxname文件夹中的内容

help toolboxname/functionname

help classname.methodname    //显示某一类的函数帮助

help classname

help syntax

t=help('topic')

例如:

>> help

HELP topics:

MATLABxl\MATLABxl     -MATLABBuilderEX

MATLAB\demos       -Examples anddemonstrations.

MATLAB\graph2d       -Two dimensional graphs.

MATLAB\graph3d       -Three dimensional graphs.

MATLAB\graphics      -HandleGraphics.

MATLAB\plottools      -Graphicalplot editing tools

blocks\library        - (No tableof contents file)

simulink\simulink       -Simulink

simulink\blocks        -Simulink block library.

simulink\components      -Simulink components.

simulink\fixedandfloat      -SimulinkFixedPoint utilities.

fixedandfloat\obsolete      - (No table of contents file)

simulink\dee         -DifferentialEquationEditor

simulink\MPlayIO       - (No table of contents file)

wavelet\wavedemo       - (No table of contents file)

wavelet\compression      - (No table of contents file)

xpc\xpc          - xPCTarget

xpcblocks\thirdpartydrivers    - (No table of contents file)

build\xpcblocks        - xPCTarget --Blocks

xpc\xpcdemos        - xPCTarget --demos and sample script files.

2.帮助系统

MATLAB的联机帮助系统非常全面。用户可以通过输入>>help进入MATLAB的联机帮助系统,如图1-13所示。

下面介绍联机帮助系统的使用方法和技巧。

联机帮助系统界面的菜单项与大多数Windows 程序界面的菜单含义和用法都差不多,熟悉Windows的用户可以很容易地掌握,在此不作详细介绍。

帮助向导页面包含 4个页面,分别是帮助主题(Contents)、帮助索引(Index)、查询帮助(Search)以及演示帮助(Demos)。如果知道需要查询的内容的关键字,一般可选择Index或Search 模式来查询;只知道需要查询的内容所属的主题或是只是想进一步了解和学习某一主题,一般可选择Contents或Demos 模式来查询。图1-13 联机帮助系统

3.联机演示系统

通过联机演示系统,用户可以直观、快速地学习MATLAB中某个工具箱的使用方法,它是有关的参考书籍所不能替代的。下面就向读者介绍如何使用联机演示系统。

可以通过在命令窗口输入demos;的方式打开联机演示系统。

例如,在MATLAB命令窗口中执行“>>demos”命令,弹出如图1-14所示的界面。图1-14 联机演示系统

联机演示系统对于学习工具箱以及MATLAB各个方面的应用的用户非常有意义。通过演示示例,用户可以快速直观地掌握某一工具的使用方法,而不必从枯燥的理论开始学起。1.3 掌握MATLAB编程

为了更好地使用MATLAB,用户需要熟练掌握和理解MATLAB的常用命令,即基本函数,下面对这些命令进行介绍。1.3.1 通用命令

通用命令是MATLAB中经常使用的一组命令,这些命令可以用来管理目录、命令、函数、变量、工作空间、文件和窗口。

1.常用命令

常用命令的功能如表1-3所示。表1-3 常用命令

2.输入内容的编辑

在MATLAB命令窗口中,为了便于对输入的内容进行编辑,MATLAB提供了一些控制光标位置和进行简单编辑的一些常用编辑键和组合键,掌握这些可以在输入命令的过程中起到事半功倍的效果。表1-4列出了一些常用键盘按键及其作用。表1-4 命令行中的键盘按键

3.标点

在MATLAB语言中,一些标点符号也被赋予了特殊的意义,或代表一定的运算,具体内容如表1-5所示。表1-5 MATLAB语言的标点1.3.2 演示示例

首先以一个简单的示例向读者展示如何使用MATLAB进行简单的计算。

双击桌面上的MATLAB图标,进入MATLAB的工作环境界面;

在命令窗口中输入>>x=4*pi;,按 Enter 键,可以在工作空间窗口看到变量 x,大小为14.566 4;

在命令窗口中输入>>y=cos(x);,按Enter键,可以在工作空间窗口看到变量y,大小为1;

在命令窗口中输入>>z=cos(x/3),按 Enter 键,可以在工作空间窗口看到变量 z,大小为−0.5,命令窗口中显示代码如下:

z=

-0.5000

命令窗口中输入>>clear;clc;将清空命令窗口和工作空间窗口的所有变量。

注意:当命令后面有分号时,按 Enter 键后,命令窗口中不显示运算结果;如果无分号,则在命令窗口中显示运算结果。当希望先输入多条语句,然后再同时执行它们,则在输入下一条命令时,在按住Ctrl 键的同时按下Enter 键进行换行输入。1.3.3 编程语句

在前面举的MATLAB程序都十分简单,包括一系列的MATLAB语句,这些语句按照固定的顺序一个接一个的执行,像这样的程序我们称之为顺序结构程序。MATLAB的主要功能虽然是数值运算,但它也是一个完整的程序语言,有各种语句格式,主要包括3种,即顺序、选择、循环结构。

1.选择结构

选择结构可以使MATLAB选择性执行指定区域内的代码(称之为语句块blocks),而跳过其他区域的代码。

(1)if 结构。

选择结构在MATLAB中有3 种具体的形式:if 结构、switch 结构和try/catch 结构。

if 结构的基本形式如下:

if control_expr_1

Statement 1

Statement 2

...

elseif control_expr_2

Statement 1

Statement 2

...

else

Statement 1

Statement 2

...

end

其中控制表达式(Control Expression)控制if 结构的运算。如果control_expr_1的值非0,那么程序将会执行语句1,然后跳到end 后面的第一个可执行语句继续执行;否则,程序将会检测control_expr_2的值。如果control_expr_2的值非0,那么程序将会执行语句2,然后跳到 end 后面的第一个可执行语句继续执行。如果所有的控制表达式(Control Expression)均为0,那么程序将会执行与else 相关的语句块。

在一个if 结构中,可以有任意个elseif 语句,但else 语句最多有一个。只要上面每一个控制表达式均为0,那么下一个控制表达式将会被检测。一旦其中的一个表达式的值非0,对应的语句块就要被执行,然后跳到end 后面的第一个可执行语句继续执行。如果所有的控制表达式(Control Expression)均为0,那么程序将会执行else 语句。如果没有else 语句,程序会执行end 后面的语句,而不执行if 结构中的部分。

(2)switch 结构。

switch 结构是另一种形式的选择结构。程序员可以根据一个单精度整型数、字符或逻辑表达式的值来选择执行特定的代码语句。

switch (switch_expr)

case case_expr_1,

Statement 1

Statement 2

...

case case_expr_2

Statement 1

Statement 2

...

otherwise,

Statement 1

Statement 2

...

end

如果switch_expr的值与case_expr_1相符,那么第一个代码块将会被执行,然后程序将会跳到switch结构后的第一个语句;如果switch_expr的值与case_expr_2相符,那么第二个代码块将会被执行,然后程序将会跳到switch 结构后的第一个语句。

在这个结构中,用相同的方法来对待其他的情况。otherwise语句块是可选的,如果它存在的话,当switch_expr的值与其他所有的选项都不相符时,这个语句块将会被执行;如果它不存在,且switch_expr的值与其他所有的选项都不相符,那么这个结构中的任何一个语句块都不会被执行。这种情况下的结果可以看作没有选择结构,直接执行MATLAB语言。

如果说switch_expr有很多值可以导致相同代码的执行,那么这些值可以括在同一括号内,如下所示。如果这个switch表达式和表中任何一个表达式相匹配,那么这个语句块将会被执行。

switch (switch_expr)

case {case_expr_1,case_expr_2,case_expr_3},

Statement 1

Statement 2

...

otherwise,

Statement 1

Statement 2

...

switch_expr和每一个case_expr既可以是数值,也可以是字符值。

注意,在大多情况下只有一个语句块会被执行。当一个语句块被执行后,编译器就会跳到end 语句后的第一个语句开始执行。如果switch 表达式和多个case表达式相对应,那么只有它们中的第一个将会被执行。

2.循环结构

循环(Loop)是一种MATLAB结构,它允许我们多次执行一系列的语句。循环结构有两种基本形式:while循环和for循环。

(1)while 循环。

while 循环和for 循环两者之间的最大不同在于代码的重复是如何控制的。在while 循环中,代码的重复次数是不能确定的,只要满足用户定义的条件,重复就进行下去。

相对地,在 for 循环中,代码的重复次数是确定的,在循环开始之前,就知道代码重复的次数了。

只要满足一定的条件,while 循环是一个重复次数不能确定的语句块。它的基本形如下:

while expression

...

end

如果expression的值非零(True),程序将执行代码块,然后返回到while 语句执行。如果expression的值仍然非零,那么程序将会再次执行代码。直到expression的值变为0,这个重复过程结束。当程序执行到 while 语句且 expression的值为0 之后,程序将会执行end后面的第一个语句。

(2)for循环。

for 循环结构是另一种循环结构,它以指定的数目重复地执行特定的语句块。for 循环的形式如下:

for index=expr

Statement 1

...

Statement n

end

其中,index是循环变量(就是我们所熟知的循环指数),exp是循环控制表达式。变量index读取的是数组expr的行数,然后程序执行循环体,所以expr有多少列,循环体就循环多少次。expr经常用捷径表达式的方式,即first:incr:last。

在for和end之间的语句我们称之为循环体。在for循环运转的过程中,它将被重复地执行。1.4 数据类型

MATLAB中定义了很多种数据类型,其中包括整数、浮点数、字符串、逻辑运算符、单元数组、结构体和函数句柄等。1.4.1 整数数据类型

MATLAB支持8位、16位、32位和64位的有符号和无符号整数数据类型。表1-6对这些数据类型进行了总结。表1-6 整数数据类型

表 1-6中的整数数据类型除了定义范围不同外,它们具有相同的性质。它们的定义范围可以通过函数intmax和intmin获得,其中intmax获得范围的上限,intmin获得范围的下限。下例分别获取int8和uint32的上限和下限:

>> intmax('int8')

ans=

127

>> intmin('uint32')

ans=

0

我们可以通过多种方式创建一个整数数据变量。当我们需要一个全0或全1数组时,可以使用函数zeros和ones。下例分别创建int8类型的全0数组和uint16类型的全1数组:

>> m=zeros(1,6,'int8')

m=

0 0 0 0 0 0

>> class(m) % confirm class of result

ans=

int8

>> n=ones(4,'uint16')

n=

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

>> class(n)

ans=

uint16

下面的示例代码演示了基于相同类整数数据类型之间的数学运算:

>> k=int8(1:7)

k=

1 2 3 4 5 6 7

>> m=int8(randperm(7))

m=

7 2 3 6 4 1 5

>> k+m % addition

ans=

8 4 6 10 9 7 12

>> k-m % subtraction

ans=

-6 0 0 -2 1 5 2

>> k.*m % element by element multiplication

ans=

7 4 9 24 20 6 35

>> k./m

ans=

0 1 1 1 1 6 1

>> k

k=

1 2 3 4 5 6 7

>> k/k(2)

ans=

1 1 2 2 3 3 4

注:MATLAB在进行整数除法时,首先基于双精度类型进行运算,然后将运算结果进行四舍五入取整,最后把取整结果转化为原来的整数数据类型。

MATLAB至今还未定义不同整数数据类型之间的数学运算,不过,一个双精度类型的标量和一个整数数据类型的数组之间可以进行数学运算,此时,MATLAB先把双精度类型的标量转化为相应的整数数据类型,然后执行需要的数学运算,如下例所示。

>> m

m=

7 2 3 6 4 1 5

>> class(m)

ans=

int8

>> n=cast(k,'uint16')

n=

1 2 3 4 5 6 7

>> m+n % try mixed type addition

Error using+

Integers can only be combined with integers of the same class,or scalar doubles.

>> n+3

ans=

4 5 6 7 8 9 10

>> class(ans)

ans=

uint16

>> n-(1:7)

Error using−

Integers can only be combined with integers of the same class,or scalar doubles.

MATLAB仅支持一个双精度类型的标量和一个整数数据类型数组之间的混合数学运算,但不支持一个双精度类型的数组和一个整数数据类型数组之间的混合数学运算。

由于每种整数数据类型都有相应的取值范围,因此数学运算有可能产生结果溢出(即得出超过相应整数数据类型取值范围的结果)。

MATLAB利用饱和处理处理此类问题,即当运算结果超出了由函数 intmin和intmax指定的上下限时,就将该结果设置为intmin或intmax的返回值,到底是哪一个,主要看溢出的方向。具体见下例:

>> k=cast('hellothere','uint8')

k=

104 101 108 108 111 116 104 101 114 101

>> double(k)+150

ans=

254 251 258 258 261 266 254 251 264 251

>> k+150

ans=

254 251 255 255 255 255 254 251 255 251

>> k-110

ans=

0 0 0 0 1 6 0 0 4 0

总之,MATLAB支持各种整数数据类型。除了64位整数数据类型外,其他整数数据类型都具有比双精度类型较高的存储效率。

基于同一整数数据类型的数学运算将产生相同数据类型的结果。混合数据类型的运算仅限于在一个双精度类型的标量和一个整数数据类型数组之间进行。1.4.2 浮点数数据类型

本节的浮点数数据类型同样符合 IEEE为双精度数据类型运算制定的标准。为了节省存储空间,MATLAB也支持单精度数据类型的数组。

基于单精度数据类型的数学运算的定义和操作与1.4.1节整数数据类型基本相同。在下面的例子中,我们分别用函数realmin、realmax和eps得到单精度数据类型的取值范围和精度。

>>realmin('single')

ans=

1.1755e-38

>>realmax('single')

ans=

3.4028e+38

>>eps('single')

ans=

1.1921e-07

>>realmin('double')

ans=

2.2251e-308

>>realmax('double')

ans=

1.7977e+308

>>eps

ans=

2.2204e-16

单精度数据的创建与前述整数数据的创建方法相同,如下例所示。

>> a=zeros(1,5,'single')

a=

0 0 0 0 0

>> b=eye(3,'single')

b=

1 0 0

0 1 0

0 0 1

>> c=single(1:7)

c=

1 2 3 4 5 6 7

>> d=cast(6:-1:0,'single')

d=

6 5 4 3 2 1 0

单精度数据之间或单精度与双精度数据之间的数学运算的结果将为单精度数,如下例所示。

>> c.^d

ans=

1 32 81 64 25 6 1

>> c*pi

ans=

5.1416 8.2832 11.4248 14.566 2.708 110.85 23.991

>> d.*rand(size(d))

ans=

6.879 0.049307 0.55556 0.6083 0.39744 0.60379 0

>> class(ans)

ans=

single

MATLAB支持双精度和单精度数组之间的数学运算,返回单精度值。

单精度数据类型中包含双精度数据类型中常见的特殊浮点值Inf和NaN,如下例所示。

>> c

c=

1 2 3 4 5 6 7

>> c(1:2:end)=0

c=

0 2 0 4 0 6 0

>> c./c

Warning: Divide by zero.

Ans=

NaN 1 NaN 1 NaN 1 NaN

>> 3./c

Warning: Divide by zero.

Ans=

Inf 0.5 Inf 0.25 Inf 0.16667 Inf1.4.3 字符串

尽管MATLAB的主要功能是对数值的处理能力,但有时我们也不可避免地遇到处理文本的情形,例如,在画图时需要插入坐标轴标签和标题等。

鉴于此,MATLAB也定义了针对文本处理的数据类型——字符串。

MATLAB中,字符串是特殊的ASCII数值型数组,只不过它们显示出来的是字符形式。下例创建了一个字符串t,并用size和whos函数查看其大小:

>> t='How about this character string?'

t=

How about this character string?

>> size(t)

ans=

1 32

>> whos

Name  Size Bytes Class

ans   1×2 16   double array

t   1×32  64    char array

Grand total is 34 elements using 80 bytes

在MATLAB中,一个字符串就是用单引号括起来的一系列字符的组合,其中的每个字符都是该字符串的一个元素,通常都用两个字节来存储。

要查看一个字符串的底层ASCII值,用户只要使用一个简单的数学运算函数(例如,double、abs等)就可以了。下例利用double和abs函数查看t的ASCII值:

>> u=double(t)

u=

Columns 1 through 12

72 111 119 32 97 98 111 117 116 32  116 104

Columns 13 through 24

105 115 32 99 104 97 114 97 99 116  101 114

Columns 25 through 32

32 115 116 114 105 110 103 63

>> abs(t)

ans=

Columns 1 through 12

72 111  119 32 97 98 111 117 116 32 116 104

Columns 13 through 24

105 115  32 99 104 97 114 97 99 116 101 114

Columns 25 through 32

32 115  116 114 105 110 103 63

要想将一串ASCII值转化为字符串显示,可以使用char函数,下例将u重新转化为字符串进行显示:

>> char(u)

ans=

How about this character string?

注意:MATLAB可以把一个负值转换成一个空字符,但同时给出一条警告信息;对于大于255的数,MATLAB将直接从大于char(255)的字符中选取(这一点与以前的版本不同)。读者可以利用下面的代码验证这两条结论:

>> a=double('a')

a=

97

>> char(a)

ans=

a

>> char(a+256)

ans=

š

>> char(a-256)

Warning: Out of range or non-integer values truncated during conversion to character.

ans=

因为字符串从其本质讲是用ASCII值表示的数组,因此它们可以用MATLAB提供的所有数组处理工具进行处理。例如,下面的代码利用直接数组索引获取字符串中的部分字符:

>> u=t(16:24)

u=

character

上例中,由于 t的第16 到第24个元素包含的是character 这个词,因此,u的值为“character”。下例则按照相反的顺序获取t的第16到第24个元素:

>> u=t(24:-1:16)

u=

retcarahc

我们还可以使用转置操作符将字符串转化为列的形式。例如,下例获取t的第16到第24个元素并写成列的形式:

>> u=t(16:24)'

u=

c

h

a

r

a

c

t

e

r

若一个字符串本身含有单引号这个字符,需要将该单引号写成两个单引号形式,如下例所示:

>> v='I can''t find the manual!'

v=

I can't find the manual!

另外,我们可以使用与数组组合相同的方式将多个字符串组合成一个字符串,如下例所示:

>> u='If a woodchuck could chuck wood,';

>> v=' how much wood could a woodchuck chuck?';

>> w=[u v]

w=

If a woodchuck could chuck wood,how much wood could a woodchuck chuck?

函数disp显示一个字符串的内容而不显示其变量名,因此,它通常用于在脚本文件中显示必要的说明性文字。例如,下例用disp函数显示了u的内容:

>> disp(u)

If a woodchuck could chuck wood,

字符串数组可以是多行多列的数组,但必须保证每一行都有相同的列数。因此,当用户创建一个多行字符串数组时,需要显式地输入部分空格,以便使所有的行长度相同。例如,下面的代码创建一个 3 行的字符串数组 v,其中的第二行和第三行都输入了部分空格以便使各行长度相等:

>> v=['Character strings having more than'

'one row must have the same number '

'of columns just like arrays!    ']

v=

Character strings having more than

one row must have the same number

of columns just like arrays!

为了省去输入空格的麻烦,我们可以采用函数char和strvcat从多个长度不同的字符串生成一个多行字符串数组。例如,下面的代码分别利用函数char和strvcat由6个长度不同的单词生成一个6行的字符串数组legends:

>> legends=char('Wilt','Russel','Kareem','Bird','Magic','Jordan')

legends=

Wilt

Russel

Kareem

Bird

Magic

Jordan

>> legends=strvcat('Wilt','Russel','Kareem','Bird','Magic','Jordan')

legends=

Wilt

Russel

Kareem

Bird

Magic

Jordan

>> size(legends)

ans=

6 6

由上述代码可知,函数char和strvcat功能基本相同,唯一的区别在于strvcat函数忽略空字符串输入,而char函数遇到空字符串就插入一个空行,如下例所示:

>> char('one',' ','two','three')

ans=

one

two

three

>> strvcat('one',' ','two','three')

ans=

one

two

three

如果两个或多个字符串数组具有相同的行数,则可以使用 strcat 函数将它们在水平方向上连接起来。该函数在连接时首先将各行填补的空格符去掉,然后对剩余的有效字符进行连接,连接完成之后,再根据生成的字符串数组各行的需要,补充空格符。下边的例子使用strcat函数将字符串数组a和b水平连接起来:

>> a=char('apples','bananas')

a=

apples

bananas

>> b=char('oranges','grapefruit')

b=

oranges

grapefruit

>> strcat(a,b)

ans=

applesoranges

bananasgrapefruit

因为字符串数组为了保证各行相等,将较短的行用空格符补充,因此,当我们从一个字符串数组中提取一行时,有时会含有不需要的空格符,要想将这些空格符去掉,可以使用deblank函数。该函数的具体用法如下面的代码所示:

>> c=legends(4,:)

c=

Bird

>> size(c)

ans=

1 6

>> c=deblank(legends(4,:))

c=

Bird

>> size(c)

ans=

1 41.4.4 逻辑运算符

逻辑运算就是我们通常说的“与”、“或”、“非”,主要用于将多个关系表达式组合在一起,或对关系表达式进行取反操作,包括表1-7中的5个逻辑运算符。表1-7 逻辑运算符

下面,我们仍用上节创建的数组A和B来演示这些逻辑运算符的用法。首先利用关系运算创建一个逻辑数组tf,代码如下:

>> A=1:9; B=11-A;% recall data

>> tf=A>4

tf=

0  0  0  0  1  1  1  1  1

我们可以利用逻辑非(~)运算符将tf中的元素取反,代码如下:

>> tf=~(A>4)

tf=

1  1  1  1  0  0  0  0  0

下面的代码在两个关系表达式之间执行逻辑与(&)操作:

>> tf=(A>2) & (A<6)

tf=

0  0  1  1  1  0  0  0  0

从结果可以看出,上述语句找出A中大于2小于6的元素,并在相应的位置返回True(1)。

标量避绕式逻辑操作符(&&和||)是MATLAB新增的两个逻辑操作符,“标量”指这两个操作符只用于标量关系表达式中,“避绕式”指MATLAB按顺序执行由这两个操作符连接的标量关系表达式,当执行到某一表达式时就已经知道该逻辑运算的结果时,就不再执行后面的表达式,也就是说,将绕过后面的表达式直接得出逻辑结果。为了更好地理解“避绕式”的含义,请看下面的示例代码:

>> a=0; b=pi;

>> a==0 || b~=1

ans=

1

>> b==1 && a==0

ans=

0

>> a==0 || (1/a)<1

ans=

1

上述最后一条语句充分说明了“避绕”的存在:由于 a==0 已经为True,这样整个或操作的结果也必将为True,因此,MATLAB就不再执行(1/a)<1这一关系操作,假如MATLAB执行这一操作的话,必将会给出一个告警信息,说明用0作了除数(因为a=0)。

MATLAB在执行含有关系运算和逻辑运算的数学运算时,同样遵循一套优先级原则。原则规定:MATLAB首先执行具有较高优先级的运算,然后执行具有较低优先级的运算;如果两个运算的优先级相同,则按从左到右的顺序执行。表1-8给出了MATLAB中各运算符的优先级顺序。表1-8 运算符优先级

用过其他编程语言的用户可以看到,表 1-8的优先级顺序与大多数计算机编程语言基本相似。用户可以使用括号任意改变表 1-8的运算优先级顺序,但同一级括号内部仍遵循表1-8的优先级顺序和原则。

读者可以利用下面的代码验证逻辑与(&)和逻辑或(|)的优先级:

>> 3|2&0

ans=

1

>> 3|(2&0)

ans=

1

>> (3|2)&0

ans=

01.4.5 单元数组类型

单元数组就是每个元素为一个单元的数组。每个单元都可以包含任意数据类型的MATLAB数组。例如,单元数组的一个单元可以是一个实数矩阵,或是一个字符串数组,也可以是一个复向量数组。

1.单元数组的构造

构造单元数组有左标志法和右标志法两种方法,下面就详细介绍这两种方法。

(1)左标志法。

左标志法就是把单元标志{}放在左边,例如,创建一个2×2的单元数组可以使用如下语句:

>>c{1,1}='Butterfly';

>>c{1,2}=@cos;

>>c{2,1}=eye(1,2);

>>c{2,2}=false;

(2)右标志法。

右标志法就是把标志符放在右边,例如,创建和上面一样的单元数组可以使用如下语句:

>>c(1,1)={'Butterfly'};

>>c(1,2)={@cos};

>>c(2,1)=eye{1,2};

>>c(2,2)={false};

上述语句还可以简单地写为下面的代码:

>>c={'Butterfly',@cos;eye(1,2),false};

要显示单元数组可以在命令行中直接输入单元数组的名字,代码设置如下:

>>c

由上述语句得到的输出代码如下:

c=

'Butterfly'@cos

[1x2double][0]

另一种显示单元数组的方法是使用函数celldisp(),代码如下:

>>celldisp(c)

由上述语句得到的输出代码如下:

c{1,1}=

Butterfly

c{2,1}=

10

c{1,2}=

@cos

c{2,2}=

0

注意:函数celldisp()的显示格式与直接输入单元数组名的显示格式是不同的。celldisp()函数更适用于具有大量数据的单元数组的显示。

2.单元数组的读取

以程序c={'Butterfly',@cos;eye(1,2),false}为例。要读取c{1,1}中的字符串,可以使用如下语句:

>>Str=c{1,1}

由上述语句得到的输出代码如下:

Str=

Butterfly

如果要读取单元数组的若干个单元的数据,例如,读取单元数组c的第1行,可以用下面语句:

>>c(1,:)

上述语句得到的输出代码如下:

ans=

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载