MATLAB图像处理超级学习手册

978-7-115-34727-5
作者: MATLAB技术联盟 张岩
译者:
编辑: 王峰松
分类: Matlab

图书目录:

详情

本书以最新推出的MATLAB R2013a软件为基础,在介绍编程知识的基础上,讲述了图像处理的主要内容,具体包括亮度变换、线性和非线性空间滤波、频率域滤波、图像复原与配准、彩色图像处理、图像数据压缩、形态学图像处理、图像分割、区域和边界表示与描述,以及对象识别等。本书在讲解时结合相关的函数或命令,精心编写了一些具体的示例,并在每章的小结中给出了软件使用的经验技巧等供读者参考。

图书摘要

MATLAB图像处理超级学习手册
MATLAB技术联盟 张岩 编著
人民邮电出版社

北京

图书在版编目(CIP)数据

MATLAB图像处理超级学习手册/张岩编著.--北京:人民邮电出版社,2014.5

ISBN 978-7-115-34727-5

Ⅰ.①M… Ⅱ.①张… Ⅲ.①Matlab软件—应用—数字图象处理—手册 Ⅳ.①TN911.73-62

中国版本图书馆CIP数据核字(2014)第036472号

内容提要

本书以 MATLAB R2013a 版本的功能叙述为主,由浅入深全面地讲解了 MATLAB 软件在图像处理方面的应用知识。本书自始至终采用实例进行描述,内容完整且每章相对独立,是一本不可多得的MATLAB图像处理的学习参考书。

本书涉及面广,涵盖了一般用户需要使用的各种功能,详细介绍了MATLAB在图像处理方面的使用。全书共分为14章,主要包括MATLAB基础知识、MATLAB基本运算及程序设计、图形绘制、图像处理基础、图像的运算、图像的变换、图像的增强、图像压缩编码技术、图像的复原、图像分割技术、数学形态学的应用、MATLAB 图像处理在实际中的应用、MATLAB 图形用户界面及 GUI在图像处理中的应用等。本书强调了图像处理的理论和应用相结合,并给出了大量数字图像处理技术的MATLAB实现程序。

本书以实用为目标,深入浅出,实例引导,讲解详实,适合作为理工科高等院校研究生、本科生教学用书,也可作为从事图像处理工作的广大科研、工程技术人员的参考用书。

◆编著 MATLAB技术联盟 张岩

责任编辑 王峰松

责任印制 彭志环 焦志炜

◆人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

北京铭成印刷有限公司印刷

◆开本:787×1092 1/16

印张:28.25

字数:666千字  2014年5月第1版

印数:1-3000册  2014年5月北京第1次印刷

定价:69.00元

读者服务热线:(010)81055410 印装质量热线:(010)81055316

反盗版热线:(010)81055315

广告经营许可证:京崇工商广字第0021号

前言

图像是人类获取信息的重要来源。当今的信息化社会,对图像处理和图像分析的要求越来越高,现有的图像软件由于采购成本和功能的限制,已经不能完全满足专业人士的需要,这时就需要专业人士来编写自己的图像处理软件。但是,由于专业和时间的限制,专业人士不一定有大量的时间来完成编程工作,这就需要有一个编程简单、功能强大的图像处理软件开发平台,如VC、MATLAB等。这些软件的广泛应用,为图像技术的发展提供了强大的支持。

MATLAB是国际公认的优秀的科技应用软件,它具有编程简单、数据可视化功能强、可操作性强的特点,其图像处理工具箱功能强大、专业函数丰富,是必备的图像处理软件工具。

目前,MATLAB已广泛应用于信号处理、通信原理、自动控制等专业的基础课程实验平台,对于学生而言,最有效的学习途径是结合某一专业课程的学习掌握该软件的使用与编程方法。本书将通过大量的例子,全面、系统地介绍应用MATLAB R2013a 进行图像处理的方法。

1.本书特点

由浅入深,循序渐进:本书以初、中级读者为对象,以MATLAB软件为主线,先让读者了解其各项功能,然后进一步详细地介绍MATLAB在图像处理方面的各种应用。

步骤详尽,内容新颖:本书结合作者多年MATLAB的使用经验与图像处理实际应用案例,将MATLAB软件的使用方法与技巧详细地呈现给读者,使读者在阅读时能够快速掌握书中所讲内容。

重点突出,轻松易学:本书以掌握概念、强化应用为重点,注重理论与实际的结合。

2.本书内容

本书基于MATLAB R2013a 版,讲解了MATLAB 图像处理的基础知识和核心内容。全书共分为14章,具体内容如下。

第1章 MATLAB 基础知识。主要介绍了MATLAB 的发展历程及特点、MATLAB软件基础知识等内容。

第2章 MATLAB 基本运算及程序设计。主要介绍了矩阵的寻访、矩阵的运算、符号的运算、M文件与M函数、程序设计等内容。

第3章 图形绘制。主要介绍了二维、三维图像的绘制及编辑等内容,并通过大量的例子来介绍二维、三维特殊图像的绘制知识。

第4章 图像处理基础。主要介绍了图像的类型、图像的读写、图像显示、图像类型的转换、颜色模型及转换等内容。

第5章 图像的运算。主要介绍了点运算、代数运算、逻辑运算、几何运算、仿射变换、邻域与块操作等内容。

第6章 图像的变换。主要介绍了傅里叶变换、离散余弦变换、Radon 变换、离散沃尔什-哈达玛变换、小波变换等内容。

第7章 图像的增强。主要介绍了灰度变换增强、空域滤波增强、频域滤波增强、彩色增强,以及小波变换在图像增强方面的应用等内容。

第8章 图像压缩编码技术。主要介绍了图像压缩编码评价标准、DCT 变换编码、有损编码、无损编码以及小波图像压缩编码等内容。

第9章 图像的复原。主要介绍了图像的退化模型、估计退化函数、逆滤波复原、维纳滤波复原、约束的最小二乘方滤波复原、Lucy-Richardson滤波复原,以及盲去卷积滤波复原等内容。

第10章 图像分割技术。主要介绍了图像分割技术的发展趋势及基本原理、边缘检测、阈值分割、区域分割以及分水岭分割等内容。

第11章 数学形态学的应用。主要介绍了数学形态学的基本运算、数学形态学应用、数学形态学重建等内容。

第12章 MATLAB 图像处理在实际中的应用。主要介绍了MATLAB 在医学、图像识别、汽车牌照识别方面的应用等内容。

第13章 MATLAB 图形用户界面。主要介绍了图形用户界面、MATLAB 图形对象、GUI菜单设计、GUI对话框的设计、GUI程序设计等内容。

第14章 GUI 在图像处理中的应用。主要通过一个例子介绍了图形用户界面应用于图像处理等内容。

本书附录给出了图像处理工具箱函数汇总表,方便读者查询使用。本书中用到的所有程序代码和数据,请到作者博客下载。

3.读者对象

本书结构合理,叙述详细,实例丰富,适合于MATLAB初学者和期望学习MATLAB高级技术的读者学习。具体说明如下:

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

★广大科研工作人员

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

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

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

★MATLAB爱好者

4.本书作者

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

虽然作者在本书的编写过程中力求叙述准确、完善,但由于水平有限,书中欠妥之处在所难免,希望读者能够及时指出,以共同促进本书质量的提高。

5.读者服务

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

编者

2013年秋

第1章 MATLAB 基础知识

MATLAB(MATrix LABoratory)用法简单、灵活性好、程式结构强又兼具延展性。它提供了一个高性能的用于数值计算和图形显示的科学和工程计算软件环境。这种易于使用的环境,是一种基于矩阵运算、具有强大的数值运算和数据处理功能的高级编程环境,广泛应用于信号分析、语音分析、优化设计等领域,在复杂算法方面表现出其他语言难以比拟的优势,目前已成为国际上最为流行的软件之一。

学习目标:

1.了解MATLAB的产生和发展历程及其特点、系统结构。

2.熟悉MATLAB系统结构、菜单栏、工具箱和桌面操作结构等。

3.掌握查询帮助命令相关的函数用法。

1.1 MATLAB 简介

MATLAB是由美国MathWorks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案。

1.1.1 什么是MATLAB

MATLAB提供了一个高性能的用于数值计算和图形显示的科学和工程计算软件环境。这种易于使用的 MATLAB 环境,是由数值分析、矩阵运算、信号处理和图形绘制等模块组成的。在这种环境下,问题和解答的表达形式(程序)几乎和它们的数学表达式完全一样,而不像传统的编程那样繁杂。

MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C、FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了Maple等软件的优点,这使MATLAB成为一个强大的数学软件。

在MATLAB新的版本中也加入了对C、FORTRAN、C++、JAVA的支持。用户可以直接调用,也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用。此外,许多的MATLAB爱好者都编写了一些经典的程序,用户直接下载就可以使用。

总之,MATLAB的主要特性包括:

(1)是用于数值计算、可视化和应用程序开发的高级语言;

(2)是可实现迭代式探查、设计及问题求解的交互式环境;

(3)是用于线性代数、统计、傅里叶分析、筛选、优化、数值积分以及常微分方程求解的数学函数库;

(4)是用于数据可视化的内置图形以及用于创建自定义绘图的工具;

(5)是用于改进代码质量和可维护性并最大限度地发挥性能的开发工具;

(6)是用于构建自定义图形界面应用程序的工具。

(7)是可实现基于MATLAB的算法与外部应用程序和语言(如C、Java、.NET以及Microsoft Excel)集成的函数。

MATLAB的一个重要特色就是其工具箱很强大,有主工具箱和各种工具箱(Toolbox)。其中,功能型工具箱主要用来扩充MATLAB的数值计算、符号运算、图形建模仿真、文字处理功能以及与硬件实时交互的功能,能够用于多种学科。领域型工具箱是学科专用工具箱,其专业性很强,如控制系统工具箱(Control System Toolbox)、信号处理工具箱(Signal Processing Toolbox)、财政金融工具箱(Financial Toolbox)等。

1.1.2 MATLAB语言特点

MATLAB是所有MathWorks公司产品的基石,它提供了数值计算、2-D和3-D图形,以及单一易使用环境下的编程能力。

MATLAB具有用法简单、灵活、程式结构性强、延展性好等优点,已经成为科技计算、视图交互系统和程序中的首选语言工具。特别是它在线性代数、数理统计、自动控制、数字信号处理、动态系统仿真等方面表现突出,已经成为科研工作人员和工程技术人员进行科学研究和生产实践的有利武器。

1.以矩阵和数组为基础的运算

MATLAB 是一个高级的矩阵/阵列语言,它包含控制语句、函数、数据结构、输入输出和面向对象编程等特点。MATLAB以矩阵为基础,不需要预先定义变量和矩阵(包括数组)的维数,就可以方便地进行矩阵的算术运算、关系运算和逻辑运算等。而且,MATLAB有特殊矩阵专门的库函数,可以高效地求解诸如信号处理、图像处理、控制等问题。

2.语言简洁,使用方便

MATLAB程序书写形式自由,被称为“草稿式”语言,这是因为其函数名和表达更接近我们书写计算公式的思维表达方式,编写MATLAB程序犹如在草稿纸上排列公式与求解问题,可以快速地验证工程技术人员的算法。

此外,MATLAB还是一种解释性语言,不需要专门的编译器。具体地说,即MATLAB运行时可直接在命令行输入MATLAB语句,系统立即进行处理,完成编译、链接和运行的全过程。利用丰富的库函数,避开繁杂的子程序编程任务,压缩了一切不必要的编程工作。

3.强大的科学计算数据处理能力

MATLAB是一个包含大量计算算法的集合,其拥有600多个工程中要用到的数学运算函数,可以方便地实现用户所需的各种计算功能。

函数中所使用的算法都是科研和工程计算中的最新研究成果,而且经过了各种优化和容错处理。在通常情况下,可以用它来代替底层编程语言,如C和C++。在计算要求相同的情况下,使用MATLAB来编程工作量会大大减少。

MATLAB的这些函数集包括从最简单、最基本的函数到诸如矩阵、特征向量、快速傅里叶变换等复杂函数。

MATLAB函数所能解决的问题,大致包括矩阵运算和线性方程组的求解、微分方程及偏微分方程组的求解、符号运算、傅里叶变换和数据的统计分析、工程中的优化问题、稀疏矩阵运算、复数的各种运算、三角函数和其他初等数学运算、多维数组操作以及建模动态仿真等。

4.强大的图形处理功能

MATLAB具有非常强大的以图形化显示矩阵和数组的能力,同时,它能给这些图形增加注释,并且可以对图形进行标注和打印。

MATLAB的图形技术既包括二维和三维的可视化、图像处理、动画等高层次的专业图形的高级绘图函数,如图形的光照处理、色度处理以及四维数据的表现等,又包括一些可以让用户灵活控制图形特点的低级绘图命令,用户可以利用MATLAB的句柄图形技术创建图形用户界面。

对一些特殊的可视化要求,如图形对话等,MATLAB也有相应的功能函数,保证了用户不同层次的要求。另外,新版本的MATLAB还在图形用户界面GUI的制作上做了很大的改善,对这方面有特殊要求的用户也可以得到满足。

5.应用广泛的模块集合——工具箱

MATLAB 的一个重要特色就是具有一套程序扩展系统和一组称之为工具箱的特殊应用子程序,每一个工具箱都是为某一类学科专业和应用而定制的。

MATLAB包含两个部分,即核心部分和各种可选的工具箱。核心部分中有数百个核心内部函数。其工具箱又分为两类:功能性工具箱和学科性工具箱。功能性工具箱主要用来扩充其符号计算功能、图示建模仿真功能、文字处理功能以及与硬件实时交互功能;学科性工具箱是专业性比较强的,如control toolbox、signl proceess-ingtoolbox、commumnication toolbox等。

这些工具箱都是由该领域内学术水平很高的专家编写的,所以用户无须编写自己学科范围内的基础程序就可直接进行高、精、尖的研究。

此外,用户可以直接使用工具箱学习、应用和评估不同的方法而不需要自己编写代码。

目前,MATLAB已经把工具箱延伸到了科学研究和工程应用的诸多领域,诸如数据采集、数据库接口、概率统计、样条拟合、优化算法、偏微分方程求解、神经网络、小波分析、信号处理、图像处理、系统辨识、控制系统设计、LMI控制、鲁棒控制、模型预测、模糊逻辑、金融分析、地图工具、非线性控制设计、实时快速原型及半物理仿真、嵌入式系统开发、定点仿真、DSP与通讯、电力系统仿真等,都在工具箱家族中有了自己的一席之地。

6.可扩充性强,具有方便的应用程序接口

MATLAB不仅有着丰富的库函数,在进行复杂的数学运算时可以直接调用,而且用户还可以根据需要方便地编写和扩充新的函数库。

通过混合编程,用户可以方便地在MATLAB环境中调用其他用Fortran或C语言编写的代码。

7.源程序的开放性

开放性也许是MATLAB最受人们欢迎的特点。除内部函数以外,所有MATLAB的核心文件和工具箱文件都是可读可改的源文件,用户可通过对源文件的修改以及加入自己的文件构成新的工具箱。

8.实用的程序接口和发布平台

新版本的 MATLAB 可以利用 MATLAB 编译器和 C/C++数学库和图形库,将自己的MATLAB 程序自动转换为独立于 MATLAB 运行的 C 和 C++代码,允许用户编写可以和MATLAB进行交互的C或C++语言程序。另外,MATLAB网页服务程序还容许在Web应用中使用自己的MATLAB数学和图形程序。

1.1.3 MATLAB系统

MATLAB系统主要包括5个部分:桌面工具和开发环境,数学函数库,语言,图形处理,外部接口。其中,桌面工具包括MATLAB桌面和命令窗口,编辑器和调试器、代码分析器和用于浏览帮助、工作空间、文件的浏览器。

MATLAB 的函数库包括大量的算法,从初等函数到复杂的高等函数。MATLAB 语言是一种高级的基于矩阵和数组的语言,具有程序流控制、函数、数据结构、输入输出和面向编程等特色。在图形处理中,MATLAB 具有方便的数据可视化功能。同时,MATLAB语言能够和一些高级语言进行交互。

1.2 MATLAB 的工作环境

在一般情况下,可以使用两种方法来打开MATLAB R2013a。

一种方式是将快捷方式添加到桌面上,通过双击桌面上的快捷方式图标,打开操作界面。

另一种方式是在 MATLAB 的安装文件夹里(默认路径为 C:\Program Files\MATLAB\R2013a\ bin\win32)双击MATLAB.exe 应用程序,这样同样可以打开MATLAB 操作界面。

1.2.1 MATLAB操作界面简介

MATLAB R2013a 延续了MATLAB 2012b 的操作界面。该操作界面中包含有大量的交互式界面,如通用操作界面、工具包专业界面、帮助界面和演示界面等。这些交互性界面组合在一起,构成了MALTAB的默认操作界面。

MATLAB的主界面是一个高度集成的工作环境,有4个不同职责分工的窗口,它们分别是Command Window(命令窗口)、Command History(历史命令窗口)、Current Directory(当前目录窗口)和Workspace(工作空间窗口)。启动MATLAB后,其操作界面如图1-1所示。

1.2.2 命令窗口

MATLAB各种操作命令都是由命令窗口开始的,用户可以在命令窗口中输入MATLAB命令,以实现其相应的功能。

启动MATLAB,单击MATLAB图标,进入到用户界面,此命令窗口主要包括文本的编辑区域和菜单栏。

在命令窗口空白区域单击鼠标右键,打开快捷菜单,如图1-2 所示。常用的命令功能有Evaluate Selection(打开所选文本对应的表达式的值)、Open Selection(打开文本所对应的MATLAB文件)、Cut(剪切编辑命令)、Paste(粘贴编辑命令)等。

在命令窗口中,用户可以输入变量、函数及表达式等,回车之后系统即可执行相应的操作。例如:

>>Y=1:90

>>sum(Y)

Y =

Columns 1 through 11

1 2 3 4 5 6 7 8 9 10 11

Columns 12 through 22

12 13 14 15 16 17 18 19 20 21 22

Columns 23 through 33

23 24 25 26 27 28 29 30 31 32 33

Columns 34 through 44

34 35 36 37 38 39 40 41 42 43 44

Columns 45 through 55

45 46 47 48 49 50 51 52 53 54 55

Columns 56 through 66

56 57 58 59 60 61 62 63 64 65 66

Columns 67 through 77

67 68 69 70 71 72 73 74 75 76 77

Columns 78 through 88

78 79 80 81 82 83 84 85 86 87 88

Columns 89 through 90

89 90

ans =

4095

以上的代码是求出1~90这90个数字的和。

MATLAB分为两步来执行:

(1)定义矩阵Y,并给其赋值;

(2)调用内置函数sum,求矩阵元素之和。

此外,只要在命令窗口输入文字的前面加“%”符号,就可以为代码作诠释。

【例1-1】已知资料的误差值,利用errorbar函数表示如下。

>>x=linspace(0,2*pi,30);

y=sin(x);

e=std(y)*ones(size(x)) %标准差

errorbar(x,y,e)

运行结果如图1-3所示。

在MATLAB中,Command Window常用的命令及功能如表1-1所示。

1.2.3 M-文件编辑/调试窗口

MATLAB 用户应熟悉最经常使用的M 文件编辑器(M File Editor)。M文件编辑器不仅仅是一个文字编辑器,它还具有一定的程序调试功能,虽然没有像VC、BC那样强大的调试能力,但对于调试一般的不过于复杂的MATLAB程序来说已经足够了。

在MATLAB命令行下输入edit,弹出如图1-4所示的M文件编辑器窗口。

1.编辑功能

(1)选择。与通常鼠标选择方法类似,但这样做其实并不方便。使用 Shift+箭头键是一种更为方便的方法。

(2)复制、粘贴。Ctrl+C、Ctrl+V组合键用于实现复制、粘贴。

(3)寻找替代。寻找字符串时用Ctrl+F组合键显然比用鼠标单击菜单更方便。

(4)查看函数。阅读大的程序时常需要看看都有哪些函数并跳到感兴趣的函数位置,M文件编辑器没有为用户提供像VC或者BC那样全方位的程序浏览器,但提供了一个简单的函数查找快捷按钮,单击该按钮,会列出该M文件所有的函数。

(5)注释。用户可以使用Shift+5来输入%号,也可以使用Ctrl+r注释%,Ctrl+t删除注释。

(6)缩进。良好的缩进格式为用户提供了清晰的程序结构。编程时应该使用不同的缩进量,以使程序显得错落有致。增加缩进量用 Ctrl+]键,减少缩进量用 Ctrl+[ 键。当一大段程序比较混乱时,使用smart indent(智能缩进)也是一种很好的选择。

2.调试功能

M程序调试器的热键设置和VC的设置有些类似,如果用户有其他语言的编程调试经验,则调试M程序会显得相当简单。因为它没有指针的概念,这样就避免了一大类难以查找的错误。不过M 程序可能会经常出现索引错误,如果设置了stop if error(如果出错则停止,在Breakpoints菜单下),则程序的执行会停在出错的位置,并在MATLAB命令行窗口显示出错信息。下面列出了一些常用的调试方法。

(1)设置或清除断点:使用快捷键F12。

(2)执行:使用快捷键F5。

(3)单步执行:使用快捷键F10。

(4)step in:当遇见函数时,进入函数内部,使用快捷键F11。

(5)step out:执行流程跳出函数,使用快捷键Shift+F11。

(6)执行到光标所在位置:这项功能没有快捷键,只能使用菜单来完成。

(7)观察变量或表达式的值:将光标放在要观察的变量上并停留片刻,就会显示出变量的值。当矩阵太大时,则只显示矩阵的维数。

(8)退出调试模式:使用菜单或者快捷按钮来完成。

1.2.4 帮助系统窗口

有效地使用帮助系统所提供的信息,是用户掌握好MATLAB应用的最佳途径。熟练的程序开发人员总会充分地利用软件所提供的帮助信息,而MATLAB的一个突出优点就是它拥有较为完善的帮助系统。MATLAB的帮助系统可以分为联机帮助系统和命令窗口查询帮助系统。

常用的帮助信息有help、demo、doc、who、whos、what、which、lookfor、helpbrowser、helpdesk、exit、web 等。例如,在窗口中输入“help fft”就可以获得函数“fft”的信息,如图1-5所示。

1.2.5 工作空间窗口

工作空间窗口是用来显示当前计算机内存中MATLAB变量的名称、数学结构、该变量的字节数及其类型的,在MATLAB中不同的变量类型对应不同的变量名图标,可以对变量进行观察、编辑、保存和删除等操作。

工作空间窗口如图1-6所示。

若要查看或者编辑变量的具体内容,可以双击该变量名称,如双击图1-6中的h变量,可打开如图1-7 所示的Variable Editor(变量编辑)窗口。

1.2.6 图形窗口

图形窗口用来显示MATLAB所绘制的图形,这些图形既可以是二维图形,也可以是三维图形。用户可以通过选择New|Figure命令来进入图形窗口,如图1-8所示。也可以通过运行程序自动弹出图形窗口,如下例所示。

>>x=-pi:0.1:pi;

y=sin(x);

plot(x,y)

运行结果如图1-9所示。

1.2.7 当前文件夹

当前路径窗口显示当前用户所在的路径,可以在其中对MATLAB路径下的文件进行搜索、浏览、打开等操作,如图1-10所示。

1.3 查询帮助命令

MATLAB用户可以在命令窗口中直接输入命令来获得相关的帮助信息,这种获取方式比联机帮助更为快捷。在命令窗口中获取帮助信息的主要命令为help、lookfor以及模糊寻找,下面将介绍这些命令。

1.3.1 help 命令

直接输入help命令,会显示当前的帮助系统中所包含的所有项目。需要注意的是,用户在输入该命令后,命令窗口只显示当前搜索路径中的所有目录名称。例如:

>>help

HELP topics:

help

HELP topics:

MATLABhdlcoder\MATLABhdlcoder - (No table of contents file)

MATLABxl\MATLABxl     -MATLABBuilderEX

MATLAB\demos      -Examples.

MATLAB\graph2d      -Two dimensional graphs.

MATLAB\graph3d      -Three dimensional graphs.

MATLAB\graphics      -HandleGraphics.

MATLAB\plottools      -Graphical plot editing tools

MATLAB\scribe       -Annotation andPlotEditing.

MATLAB\specgraph     -Specialized graphs

……            ……

vnt\vntguis        - (No tableof contents file)

vnt\vntdemos       - (No tableof contents file)

vntblks\vntblks      - (No table of contents file)

vntblks\vntmasks     - (No table of contents file)

wavelet\wavelet      -WaveletToolbox

wavelet\wmultisig1d    - (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

build\xpcobsolete     - (No table of contents file)

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

如果用户知道某个函数名称,并想了解该函数的具体用法,则只需在命令窗口中输入help+函数名。例如:

>>help sin

sin Sine of argument in radians.

sin(X) is the sine of the elements of X.

See also asin, sind.

Overloaded methods:

codistributed/sin

gpuArray/sin

Reference page in Help browser

doc sin

1.3.2 lookfor 函数的使用

当用户不知道一些函数的确切名称时,help函数就无能为力了,这时可以使用lookfor函数解决这个问题。

在使用 lookfor 函数时,用户只需知道某个函数的部分关键字,在命令窗口中输入lookfor+关键字,就可以很方便地实现查找。例如:

>>lookfor sin

sin

BioIndexedFile   - class allows random read access to text files using an index file.

loopswitch   -Create switch foropening and closing feedback loops.

mbcinline   - replacement versionof inline using anonymous functions

cgslblock    -Constructor for calibrationGenerationSimulink blockparsingmanager

xregaxesinput    -Constructor for the axes input object for aListCtrl

ExhaustiveSearcher  -Neighbor search object using exhaustive search.

KDTreeSearcher   -Neighbor search object using a kd-tree.

……    ……

sample_supported  -<name>_supported fills in a single instance or an array

dxpcUDP1      -Target toHostTransmission usingUDP

dxpcUDP2      -Target toTargetTransmission usingUDP

j1939exampleDemo    - J1939 -UsingTransportProtocol

scscopedemo     -SignalTracingUsingScopeTriggering

scsignaldemo     -SignalTracingUsingSignalTriggering

scsoftwaredemo    -SignalTracingUsingSoftwareTriggering

1.3.3 模糊寻找

MATLAB 还提供一种模糊寻找的命令查询方法,只需在命令界面输入命令的前几个字母,然后按Tab键,系统便会列出所有以其开头的命令。例如,在命令窗口中输入“co”,然后按Tab键,运行结果如图1-11所示。

1.4 本章小结

本章首先介绍了MATLAB的基本知识及其特点,接着讲述了系统结构,MATLAB的菜单栏、工具箱和桌面操作等内容,最后又介绍了查询帮助命令的相关内容。这些基础知识,读者应熟练掌握。

第2章 MATLAB 基本运算及程序设计

MATALB是一门计算语言,矩阵是进行数据处理和运算的基本元素,它的运算指令和语法基于一系列基本的矩阵运算以及它们的扩展运算。

MATLAB中的符号数学工具箱可以用于实现符号运算,该工具箱不是基于矩阵的数值分析,而是使用字符串来进行符号分析与运算。在MATLAB中,除了可以在命令窗口输入命令逐句执行外,也可以和其他形式的语言一样采用编程的方式。

学习目标:

1.理解矩阵运算的基本原理、实现步骤。

2.了解关系运算和逻辑运算及变量表达的相关内容。

3.理解M文件与M函数的相关内容。

4.掌握MATLAB程序流程控制语句相关结构、实现步骤。

2.1 矩阵的创建

在 MATLAB 中,矩阵是进行数据处理和运算的基本元素,矩阵的创建方法主要有 4种:直接输入法、利用 M 文件建立矩阵、利用其他文本编辑器建立矩阵、利用 MATLAB内置函数建立矩阵。下面将对这些方法进行介绍。

2.1.1 直接输入法

从键盘直接输入矩阵的元素是最简单的建立矩阵的方法:将矩阵的元素用方括号括起来,按矩阵行的顺序输入各元素,同一行的各元素之间用空格或逗号分隔,不同行的元素之间用分号分隔。

在此方法下创建矩阵需要注意以下规则:

(1)矩阵元素必须在“[ ]”内;

(2)矩阵的同行元素之间用空格(或“,”)隔开;

(3)矩阵的行与行之间用“;”(或回车符)隔开。

【例2-1】下面的例子是用直接输入的方法来创建矩阵的。

>> A=[1 21 3;42 5 6;7 8 91]

A=

1 21 3

42 5 6

7 8 91

也可以写成以下的格式:

>>B=[3 5 6;

23 56 78;

99 87 1]

B=

3 5 6

23 56 78

99 87 1

2.1.2 利用M 文件建立矩阵

在MATLAB中,可以利用系统自带的文本编辑调试器专门建立一个M文件。

启动有关编辑程序或MATLAB文本编辑器,并输入待建矩阵,例如:

A=[13 21 56;42 5 80;7 76 91]

把输入的内容以纯文本方式存盘(设文件名为mymatrix.m)。

在MATLAB命令窗口中输入mymatrix:

>> mymatrix

A =

13 21 56

42 5 80

7 76 91

运行该M文件,就会自动建立一个名为MYMAT的矩阵,可供以后使用。

2.1.3 利用其他文本编辑器建立矩阵

在MATLAB中,也可以利用其他文本编辑器来创造矩阵。例如,编辑一个文本文件:

16.0 3.0 2.0 9.0

5.0 10.0 11.0 8.0

9.0 6.0 7.0 12.0

4.0 15.0 14.0 1.0

将该文本装入dat或txt等格式的文件。

如果需要该文件,可以在命令窗口输入:

>> load mymatrix.dat

>> load mymatrix.txt

【例2-2】读取矩阵文件trees.tif。

clear all;

load trees

image(X)

运行结果如图2-1所示。

2.1.4 利用MATLAB内置函数建立特殊矩阵

在MATLAB中,系统内置函数可以用于建立特殊矩阵,通过这些函数,可以很方便地得到想要的特殊矩阵。系统内置创建特殊矩阵的函数如表2-1所示。

【例2-3】利用几种系统内置特殊函数来创建矩阵。

>> Z = zeros(5,4)%产生5×4 全为0的矩阵

Z =

0 0 0 0

0 0 0 0

0 0 0 0

0 0 0 0

0 0 0 0

>> Z = ones (5,4)%产生5×4 全为1的矩阵

Z =

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

>> Z = eye (5,4)%产生5×4 的单位矩阵

Z =

1 0 0 0

0 1 0 0

0 0 1 0

0 0 0 1

0 0 0 0

>> rand (5,4)%产生5×4的在(0,1)区间均匀分布的随机阵

ans =

0.9572 0.9157 0.8491 0.3922

0.4854 0.7922 0.9340 0.6555

0.8003 0.9595 0.6787 0.1712

0.1419 0.6557 0.7577 0.7060

0.4218 0.0357 0.7431 0.0318

>> randn(5,4) %产生5×4的均值为0,方差为1的标准正态分布随机矩阵

ans =

-1.0689 -0.7549 0.3192 0.6277

-0.8095 1.3703 0.3129 1.0933

-2.9443 -1.7115 -0.8649 1.1093

1.4384 -0.1022 -0.0301  -0.8637

0.3252 -0.2414 -0.1649 0.0774

>> hilb(3) % 产生3维的Hilbert阵

ans =

1.0000 0.5000 0.3333

0.5000 0.3333 0.2500

0.3333 0.2500 0.2000

>> Z = magic(3) % 产生3阶的魔方阵

Z =

8 1 6

3 5 7

4 9 2

2.2 矩阵的拼接

两个或者两个以上的单个矩阵,按一定的方向进行连接生成新的矩阵,就是矩阵的拼接。矩阵的拼接是一种创建矩阵的特殊方法,它的基础元素是原始矩阵,目标是新的合并矩阵。

2.2.1 基本拼接

矩阵的拼接有按照水平方向拼接和按照垂直方向拼接两种方式。例如,对矩阵A和B进行拼接,拼接表达式分别如下。

水平方向拼接:C=[A B]或C=[A,B]。

垂直方向拼接:C=[A;B]。

【例2-4】把3阶魔术矩阵和3阶单位矩阵在水平方向和垂直方向上分别拼接成一个新矩阵。

>>clear all;

c= magic(3)%3阶魔术矩阵

d = eye (3)% 3阶单位矩阵

E =[c,d]% 水平方向上拼接

F =[c;d]%垂直方向上拼接

运行结果如下:

c =

8 1 6

3 5 7

4 9 2

d =

1 0 0

0 1 0

0 0 1

E =

8 1 6 1 0 0

3 5 7 0 1 0

4 9 2 0 0 1

F =

8 1 6

3 5 7

4 9 2

1 0 0

0 1 0

0 0 1

2.2.2 拼接函数

在MATLAB中,除了使用矩阵拼接符[]外,还可以使用矩阵拼接函数来拼接函数。具体的函数和功能如表2-2所示。

【例2-5】利用cat函数在不同方向上拼接矩阵。

>>clear all;

A1=[1 2;3 4]

A2=[5 6;7 8]

C1=cat(1,A1,A2) %垂直拼接

C2=cat(2,A1,A2) %水平拼接

C3=cat(3,A1,A2)%三维数组

运行结果如下:

A1 =

1 2

3 4

A2 =

5 6

7 8

C1 =

1 2

3 4

5 6

7 8

C2 =

1 2 5 6

3 4 7 8

C3(:,:,1) =

1 2

3 4

C3(:,:,2) =

5 6

7 8

2.3 MATLAB 矩阵寻访

在MATLAB中,矩阵寻访主要有下标寻访、单元素寻访和多元素寻访,下面将对其进行一一介绍。

2.3.1 下标寻访

MATLAB中矩阵的下标表示与常用的数学习惯相同,使用分别表示行和列的“双下标”(Row-Column Index),矩阵中的元素都有对应的第几行、第几列。这种表示方法简单直观,几何概念比较清晰。

【例2-6】利用上下标来寻访矩阵元素。

>>a=[1 2 3;4 5 6;7 8 9]

>>a(1,1)

>>a(2,2)

>>a(3,3)

a =

1 2 3

4 5 6

7 8 9

ans =

1

ans =

5

ans =

9

2.3.2 单元素寻访

MATLAB中,必须指定两个参数,即其所在行数和列数,才能访问一个矩阵中的单个元素。例如,访问矩阵M中的任何一个单元素时,M=(row,column)。row和column 分别代表行数和列数。

【例2-7】对矩阵M进行单元素寻访。

>>M=randn(3)

>>x= M (1,2)

>>y= M (2,3)

>>z= M (3,3)

M =

0.3714 -1.0891 1.1006

-0.2256 0.0326 1.5442

1.1174 0.5525 0.0859

x =

-1.0891

y =

1.5442

z =

0.0859

2.3.3 多元素寻访

矩阵多元素的寻访,包括寻访该矩阵的某一行或某一列的若干元素,访问整行、整列元素,访问若干行或若干列的元素,以及访问矩阵所有元素等。示例如下。

M (1:k,n):表示矩阵M 中第n 列的1~k 的元素,冒号表示矩阵中的多个元素。

N(m,:):表示矩阵N中第m行的所有元素。

【例2-8】对矩阵M进行多元素寻访。

>>M=randn(4)

>>M(1,:)%访问第1行所有元素

>>M(1:3,:)%访问第1~3行所有元素

>>M(:,2) %访问第2列所有元素

>>M(:)%访问所有元素

M =

0.1978 0.8351 -1.1480 -0.6669

1.5877 -0.2437 0.1049 0.1873

-0.8045 0.2157 0.7223 -0.0825

0.6966 -1.1658 2.5855 -1.9330

ans =

0.1978 0.8351 -1.1480 -0.6669

ans =

0.1978 0.8351 -1.1480 -0.6669

1.5877 -0.2437 0.1049 0.1873

-0.8045 0.2157 0.7223 -0.0825

ans =

0.8351

-0.2437

0.2157

-1.1658

ans =

0.1978

1.5877

-0.8045

0.6966

0.8351

-0.2437

0.2157

-1.1658

-1.1480

0.1049

0.7223

2.5855

-0.6669

0.1873

-0.0825

-1.9330

2.4 MATLAB 矩阵的运算

MATLAB 中,矩阵的运算包括+(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)等运算。下面对其进行介绍。

2.4.1 矩阵加减运算

假定有两个矩阵A和B,若A和B矩阵的维数相同,则可以执行矩阵的加减运算,A和B矩阵的相应元素相加减即可,由A+B和A-B来实现矩阵的加减运算。

【例2-9】对矩阵A和B进行加减运算。

>>A=[5 4 6;8 9 7;3 6 4]

>>B=[9 1 7;5 6 6;5 6 8]

>>C=A+B

>>D=A-B

A =

5 4 6

8 9 7

3 6 4

B =

9 1 7

5 6 6

5 6 8

C =

14 5 13

13 15 13

8 12 12

D =

-4 3  -1

3 3 1

-2 0  -4

如果A与B的维数不相同时,例如:

>>A=[5 4 6;8 9 7;3 6 4]

B=[9 1 7;5 6 6;5 6 8;7 9 8]

C=A+B

D=A-B

则MATLAB将给出错误信息,Error: using + Matrix dimensions must agree。提示用户两个矩阵的维数不匹配。

2.4.2 矩阵乘法

假定有两个矩阵A和B,若A为m×n矩阵,B为n×p矩阵,则可以进行矩阵乘法的操作,即C=A*B为m×p矩阵。矩阵乘法需要被乘矩阵的列数与乘矩阵的行数相等。

【例2-10】矩阵的相乘。

>>A=[5 4 6;8 9 7;3 6 4]

>>B=[9 1 7 1;5 6 6 2;5 6 8 3]

>>C=A*B

A =

5 4 6

8 9 7

3 6 4

B =

9 1 7 1

5 6 6 2

5 6 8 3

C =

95 65 107 31

152 104 166 47

77 63 89 27

当矩阵相乘不满足被乘矩阵的列数与乘矩阵的行数相等时,例如:

>>A=[5 6;8 7;3 4]

B=[9 1 7 1;5 6 6 2;5 6 8 3]

C=A*B

则MATLAB将给出错误信息,Error: using * Matrix dimensions must agree。提示用户两个矩阵的维数不匹配。

2.4.3 矩阵除法

矩阵除法运算中,\和/分别表示左除和右除。A\B 等效于 A 的逆左乘 B 矩阵,而 B/A等效于A矩阵的逆右乘B矩阵。左除和右除表示两种不同的除数矩阵和被除数矩阵的关系。对于矩阵运算,一般A\B≠B/A。

【例2-11】矩阵除法。

>>clear

>>A=[5 4 6;8 9 7;3 6 4];

>>B=[9 ;1 ;7];

>>C=A\B

C =

-4.1538

-0.1154

5.0385

2.4.4 矩阵的乘方

若A为方阵,x为标量,则一个矩阵的乘方运算可以表示成A^x。

【例2-12】矩阵的乘方。

>>A=[5 4 6;8 9 7;3 6 4];

>>B=A^2

>>C= A^3

B =

75 92 82

133 155 139

75 90 76

C =

1357  1620  1422

2322  2761  2439

1323  1566  1384

若D不是方阵:

D= A=[5 4 6;8 9 7]

B=D^2

则MATLAB将给出错误信息“Error: The expression to the left of the equals sign is not a valid target for an assignment”。

2.4.5 矩阵的行列式

矩阵的行列式是一个数值。在MATLAB中,det函数用于求方阵A所对应的行列式的值。

【例2-13】求矩阵的行列式。

>>A=[5 4 6;8 9 7;3 6 4]

>>det(A)

A =

5 4 6

8 9 7

3 6 4

ans =

52

2.4.6 矩阵的秩

矩阵线性无关的行数与列数称为矩阵的秩。在MATLAB中,rank函数用于求矩阵的秩。

【例2-14】求矩阵的秩。

>>A=[5 4 6;8 9 7;3 6 4]

>>rank(A)

A =

5 4 6

8 9 7

3 6 4

ans =

3

2.4.7 矩阵的逆

对于一个方阵A,如果存在一个与其同阶的方阵B,使得A*B=B*A=I(I为单位矩阵),则称B为A的逆矩阵,当然,A也是B的逆矩阵。

求一个矩阵的逆是一件非常烦琐的工作,容易出错,但在MATLAB中,求一个矩阵的逆非常容易,inv函数用于求方阵的逆矩阵。

【例2-15】求矩阵的逆。

>>A=[1 2 3;5 5 6;7 7 9];

>>inv(A)

ans =

-1.0000 -1.0000 1.0000

1.0000 4.0000 -3.0000

0.0000 -2.3333 1.6667

2.4.8 矩阵的迹

矩阵的迹等于矩阵的特征值之和。在MATLAB中,trace函数用来求矩阵的迹。

【例2-16】求矩阵的迹。

>>A=[1 2 3;4 5 6;7 8 9]

>>rank(A)

A =

1 2 3

4 5 6

7 8 9

ans =

2

2.4.9 矩阵的范数及其计算函数

在MATLAB中,cond函数用于计算矩阵的范数。该函数的调用方法如下。

cond(A,1):表示计算A的1-范数下的条件数。

cond(A)或cond(A,2) :表示计算A 的2-范数数下的条件数。

cond(A,inf):表示计算A 的 ∞-范数下的条件数。

【例2-17】为求矩阵的范数。

>>A=[5 4 6;8 9 7;3 6 4];

X1=cond(A,1)

X2=cond(A)

X3=cond(A,inf)

运行结果如下:

X1 =

19

X2 =

14.9448

X3 =

24

2.4.10 矩阵的特征值与特征向量

在MATLAB中,eig函数用于计算矩阵的特征值和特征向量。该函数调用方法如下。

E=eig(A):表示求矩阵A的全部特征值,构成向量E。

[V,D]=eig(A):表示求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量。

[V,D]=eig(A, ‘nobalance’):与第2 种格式类似,但第2 种格式中先对A 作相似变换后再求矩阵A的特征值和特征向量,而格式3是直接求矩阵A的特征值和特征向量的。

【例2-18】求矩阵的特征值和特征向量。

>>A=rand(3,3)

x1=eig(A)

[V,D]=eig(A)

Y1= V*A

Y2= V*D

运行结果如下:

A =

0.3922 0.7060 0.0462

0.6555 0.0318 0.0971

0.1712 0.2769 0.8235

x1 =

-0.4960

1.0481

0.6954

V =

0.6174 -0.4576 -0.3467

-0.7822 -0.3723 -0.2087

0.0841 -0.8075 0.9145

D =

-0.4960  0  0

0 1.0481  0

0  0 0.6954

Y1 =

-0.1171 0.3253 -0.3015

-0.5865 -0.6219 -0.2441

-0.3398 0.2869 0.6785

Y2 =

-0.3062 -0.4796 -0.2411

0.3879 -0.3902 -0.1451

-0.0417 -0.8463 0.6359

2.5 关系运算和逻辑运算

在MATLAB中,提供了关系运算符和逻辑运算符,如表2-3和表2-4所示,主要用于基于真/假命题的各类MATLAB命令的流程和执行次序。

作为所有关系和逻辑表达式的输入,MATLAB把任何非零数值当作真,把零当作假。所有关系和逻辑表达式的输出,对于真,输出为1;对于假,输出为0。

关系运算表达式和逻辑运算表达式的基本语法结构为:

logicalvalue=variable1 关系运算符 varialble2;

logicalvalue=logical expression 1 逻辑运算符 logical expression 2

MATLAB关系操作符能用来比较两个同样大小的数组,或用来比较一个数组和一个标量。例如,

>>A=1:8, B=8-A

>>tf=A>4

A =

1 2 3 4 5 6 7 8

B =

7 6 5 4 3 2 1 0

tf =

0 0 0 0 1 1 1 1

注意,“=”和“==”意味着两种不同的事:“==”表示比较两个变量,当它们相等时返回1,当它们不相等时返回0;“=”表示将运算的结果赋给一个变量。

例如:

>>C=(A==B)

C =

0 0 0 1 0 0 0 0

逻辑操作符提供了一种组合或否定的关系表达式。

例如:

>>A=1:9;B=9-A;

tf1=A>4

tf2=~(A>4)% 找出A大于4

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

tf1 =

0 0 0 0 1 1 1 1 1

tf2 =

1 1 1 1 0 0 0 0 0

tf3 =

0 0 1 1 1 0 0 0 0

2.6 MATLAB 变量及表达式

在MATLAB中,可以直接对某变量进行赋值并运算,而不需要事先对变量的类型及其大小进行定义。

3.141592653589793

ans =

2.6.1 数值的表示

MATLAB 中数值的表示采用习惯的十进制,可以带小数点或负号。例如,以下输入都是合法的:

200  -11.1  0.001

科学计数法采用字符e来表示10的幂。例如:

9.45e2 1.26e3  -2.1e-5

虚数的扩展名为i或者j。例如:

2i  3ej    -3.14j

在采用IEEE浮点算法的计算机上,实数的数值范围大致为10 -308 ~ 10 308

在MATLAB中输入同一数值时,有时会发现,在命令窗口中显示数据的形式有所不同。例如,0.3有时显示为0.3,但有时会显示0.300。这是由数据显示格式不同造成的。

在一般情况下,MATLAB内部每一个数据元素都是用双精度数来表示和存储的,数据输出时用户可以用format命令设置或改变数据输出格式。表2-5揭示了不同种类的数据显示格式。

【例2-19】利用不同数据格式显示pi(圆周率)的值。

>>pi

ans =

3.1416

>> format long

>> pi

>> pi

ans =

3.141592653589793

>> format short e

>> pi

ans =

3.1416e+00

>> format long g

>> pi

ans =

3.14159265358979

>> format hex

>> pi

ans =

400921fb54442d18

2.6.2 变量的表示

在MATLAB中,当遇到某个新变量时,会自动产生一个变量并配备一个适当的存储空间;若变量已存在,则自动进行相应的替换。例如:

>> eps

ans =

2.2204e-16

>> eps=3.3

eps =

3.3000

>> eps =eps +1

eps =

4.3000

MATLAB中所有的变量都是用矩阵形式来表示的,即所有的变量都表示一个矩阵或者一个向量。其命名规则如下:

(1)变量名对大小写区分,例如,SIN与sin为两个不同的变量名;

(2)变量名的第一个字符必须为英文字母,且其长度不能超过31个字符;

(3)变量名可以包含下连字符、数字,但不能包含空格符、标点。

注意:以下关键字不能用作变量。用户可以在命令窗口输入 iskeyword 列出这些关键字。

>> iskeyword

ans =

'break'

'case'

'catch'

'classdef'

'continue'

'else'

'elseif'

'end'

'for'

'function'

'global'

'if'

'otherwise'

'parfor'

'persistent'

'return'

'spmd'

'switch'

'try'

'while'

例如,在命令窗口输入while=1,系统会出现警告。

Error: The expression to the left of the equals sign is not a valid target foran assignment.

表2-6为系统自定义的一些特殊的变量。

2.7 符号运算

在MATLAB中,符号数学工具箱(Symbolic Math Toolbox)用于实现符号运算。和别的工具箱有所不同,该工具箱不是基于矩阵的数值分析,而是使用字符串来进行符号分析与运算的。

2.7.1 创建符号变量

参与符号运算的整个过程的是符号变量,即使在符号运算中所出现的数字也按符号变量处理。MATLAB中,sym和syms函数用于建立符号变量。

使用前应先对其予以声明,然后再使用符号变量。sym函数调用方法如下:

sym ('变量名')

例如:sym(' y ')。

syms函数调用方法如下:

syms 变量名列表(每个变量名需用空格分隔,而不能用逗号分隔)

例如:syms x a。

经上述定义后,x,y,a已成为符号变量。

MATLAB中的符号表达式和符号方程是两种不同的操作对象。它们的区别在于:符号表达式不包含等号“=”,而符号方程必须带等号。例如:A=' sin(x)^2 ' 表示符号表达式;Bq=' a*x^2+b*x+c=0 '表示符号方程。

2.7.2 数值与符号的转换

在MATLAB中,可利用Sym函数将数值结果转换为符号表达式。调用方法如下。

Sym(r,' f '):表示返回符号浮点表示式。

Sym(r,' r '):表示返回符号有理数表示式。

Sym(r,' e '):表示返回符号有理数表示式。

Sym(r,' d '):表示返回符号十进制小数。

2.7.3 数值矩阵转换为符号矩阵

在MATLAB中,必须事先定义符号矩阵,然后才能对矩阵进行符号运算。将数值矩阵转换成符号矩阵的调用格式为:

Sym(矩阵名)

【例2-20】将数值矩阵A转成了符号矩阵。

>> A=hilb(3)

A =

1.0000 0.5000 0.3333

0.5000 0.3333 0.2500

0.3333 0.2500 0.2000

>> A=sym(A)

A =

[ 1 , 1/2, 1/3]

[ 1/2, 1/3, 1/4]

[ 1/3, 1/4, 1/5]

2.7.4 符号替换

在 MATLAB 中,subs 函数用于符号变量的替换,该命令适用单个符号矩阵、符号表达式、符号代数方程和微分方程中的变量替换,该函数的调用方法如下。

subs(S, new):表示用新变量new 替换S 中的默认变量。

subs(S, new, old):表示用新变量new替换S 中的指定变量old。

如果新变量是符号变量,则必须将新变量名以' new' 形式给出。

【例2-21】以符号变量'5'替换符号表达式f 中的'A' 。

>> f=sym('sin(1/3*A*pi)');

>> subs(f, '5','A')

ans =

sin((pi*A)/3)

在ans中,2仍然是符号变量。

2.7.5 常用的符号运算

符号变量和数字变量之间可以转换,也可以用数字代替符号得到数值。符号运算的种类很多,出于篇幅的考虑,下面仅对常用的符号运算进行介绍,其他的使用方法大同小异。

1.diff函数

在MATLAB中,diff函数是用于求微分的符号函数。该函数的调用方法如下。

diff(f):表示对符号表达式f进行微分运算。

diff(f,a):表示f对指定变量a进行微分运算。

diff(f,a,n):表示计算f对默认变量或指定变量a 的n 阶导数,n 是正整数。

【例2-22】对符号进行微分运算。

>>syms x n    %定义符号变量x和n

>>f=x^n;    %定义符号表达式 f

>>diff(f,x)    %符号表达式 f对x求导

>>diff(f,n)    %注意,是 f对符号变量n求导

>>df2=diff(f,x,2)   %计算 f对符号变量x的二阶导数

ans =

n*x^(n-1)

ans =

x^n*log(x)

df2 =

n*x^(n-2)*(n-1)

2.int函数

在MATLAB中,int函数是用于求积分的符号函数。该函数的调用方法如下。

int(f):表示对于符号变量f代表的符号表达式,求f关于默认变量的不定积分。

int(f,v):表示计算f关于变量v的不定积分。

int(f,a,b)或int(f,v,a,b):表示计算f关于默认变量或指定变量v从a到b的定积分。

【例 2-23】对于函数s(x, y)=xe−xy ,先求 s 关于 x 的不定积分,再求所得结果关于 y的不定积分。

>>syms x y

s='x*exp(-x*y)';

f=int(int(s),y)

运行结果如下:

f =1/y*exp(-x*y)

3.simplify与simple函数

在MATLAB中,simplify 函数用于包含和式、根式、分数、乘方、指数、对数、三角函数等的表达式的化简;simple 函数用于寻找最少字符的表达式。

4.solve函数

在MATLAB中,solve函数用于解代数方程组,该函数的调用方法如下:

solve(S1,S2)

其中,S1,S2是方程的符号表达式。

例如,求解方程组。

syms x y alpha

[x,y] = solve(x^2*y^2,x-y/2-alpha)

运行后将返回符号变量x、y的解,各4个。返回的解即使是数字量,也仍然是符号变量。

5.limit函数

在MATLAB中,limit是用于求极限的符号函数。该函数的调用方法如下。

limit (F,x,a) :表示取符号表达式F 在 x 趋于a时的极限。

limit (F,a) :表示按前面说过的规定自动搜索F中的符号变量,求其趋于a时F的极限。

limit (F) :表示指定了 a = 0 为极限点。

limit (F,x,a, ‘right’) 或 LIMIT(F,x,a, ‘left’) :表示规定了x 趋于a 的方向,也即用于取左极限或右极限。

6.dsolve函数

在MATLAB中,dsolve函数既可以解符号微分方程,也可以解普通微分方程。由于规定用符号“D”表示微分,“D2,D3,…,Dn”相应表示2阶,3阶,…,n阶微分。如不加声明,则默认符号变量为t。D2y代表,Dy代表。在解微分方程时,D不用作符号变量。如果还有初始条件,则需作另外的方程说明。

【例2-24】利用dsolve函数解微分方程。

>> y = dsolve('Dy=1+y^2','y(0)=1')%符号变量y对默认变量t的一阶方程。

y =

tan(pi/4 + t)

2.8 M 文件与 M 函数

MATLAB输入命令的常用方式有两种:一种是直接在MATLAB的命令窗口中逐条输入MATLAB命令;一种是M文件工作方式。当命令行很简单时,使用逐条输入方式还是比较方便的,但当命令行很多时(比如说几十行甚至成百上千行),显然再使用这种方式输入MATLAB命令,就会显得杂乱无章,不易于把握程序的具体走向,并且给程序的修改和维护带来很大的麻烦。这时,建议采用MATLAB命令的第2种输入形式——M文件工作方式。

M文件工作方式,指的是将要执行的命令全部写在一个文本文件中,这样既能使程序显得简洁明了,又便于对程序进行修改与维护。M文件直接采用MATLAB命令编写,就像在MATLAB的命令窗口直接输入命令一样,因此调试起来十分方便,并且增强了程序的交互性。

M文件与其他文本文件一样,可以在任何文本编辑器中进行编辑、存储、修改和读取。

利用M文件还可以根据自己的需要编写一些函数,这些函数也可以像MATLAB提供的函数一样进行调用。从某种意义上说,这也是对MATLAB的二次开发。

M文件有两种形式,一种是命令方式或称脚本方式,另一种是函数文件形式。两种形式的文件扩展名均是.m。

2.8.1 M文件

当遇到输入命令较多以及要重复输入命令的情况时,利用命令文件就显得很方便了。将所有要执行的命令按顺序放到一个扩展名为.m 的文本文件中,每次运行时只需在 MATLAB的命令窗口输入M文件的文件名就可以了。MATLAB中M文件的命名规则如下。

(1)文件名命名要用英文字符,第一个字符不能是数字。

(2)文件名不要取为 MATLAB 的固有函数名,M 文件名的命名尽量不要是简单的英文单词,最好是由大小写英文/数字/下划线等组成。原因是简单的单词命名容易与MATLAB内部函数名同名,结果会出现一些莫名其妙的错误。

(3)文件存储路径一定要为英文

(4)M文件的命名不能为两个单词,如three phase,而应该写成three_phase或者Three Phase。

需要注意的是,M文件最好直接放在MATLAB的默认搜索路径下(一般是MATLAB安装目录的子目录work中),这样就不用设置M文件的路径了,否则应当用路径操作指令path 重新设置路径。另外,M 文件名不应该与 MATLAB 的内置函数名以及工具箱中的函数重名,以免发生执行错误命令的现象。

MATLAB对命令文件的执行等价于从命令窗口中顺序执行文件中的所有指令。命令文件可以访问MATLAB工作空间里的任何变量及数据。

命令文件运行过程中产生的所有变量都等价于从MATLAB工作空间中创建这些变量。因此,任何其他命令文件和函数都可以自由地访问这些变量。这些变量一旦产生就会一直保存在内存中,只有对它们重新赋值,它们的原有值才会变化。关机后,这些变量也就全部消失了。另外,在命令窗口中运行clear命令,也可以把这些变量从工作空间中删去。当然,在MATLAB的工作空间窗口中也可以用鼠标选择想要删除的变量,从而将这些变量从工作空间中删除。

接下来,编写一个名为test.m的命令文件,用来计算矩阵1到100的和,并把它放到变量s中。

(1)在MATLAB主菜单中选择菜单命令FileNewscript,如图2-2所示。

(2)编写代码。在接下来出现的编辑框中输入相应的代码,如图2-3所示。

(3)保存。选择编辑框中的菜单命令FileSave,此时会弹出一个保存文件的对话框,将文件名中的Untitled.m改成test,单击“保存”按钮。

(4)M文件的使用。回到MATLAB的主界面,在命令窗口输入如下命令:

>>test

s =

0

s =

1

s =

3

s =

6

s =

10

s =

15

s =

21

s =

28

s =

36

s =

45

s =

55

2.8.2 M函数

M函数文件是一个特殊的M文件,其常见格式如下。

Funcdon:表示返问变量列表=函数名(输入变量列表)。

需要说明的是,这里输入变量的个数以及输出变量的个数是由MATLAB本身提供的两个保留变量nargin 和nargout 给出的,它们分别是NuMber of function input arguMents 和NuMber of function output arguMents 的缩写形式。

输入变量要用逗号隔开,输出变量多于1个时,要用方括号括起来。用户可以借助于help命令显示其中的注释说明语句段。通过这样的方法就可以建立函数文件或者M函数,其调用方法与MATLAB函数的调用方法相同。

函数文件相当于对MATLAB 进行了二次开发。它与其他高级语言子函数的作用基本相同,都是为了实现特定目的而由用户自己编写的子函数。

函数文件与命令文件有着鲜明的区别。

(1)函数文件的第一行必须包含function字符,命令文件无此要求。

(2)函数文件的第一行必须指定函数名、输入参数及输出参数,命令文件无此要求。

(3)一个函数文件可以含0个、1个或多个输入参数和返回值。

(4)函数文件要在文件的开头定义函数名,如function [y1,y2]=func(x,a,b,c),该函数文件名必须存为func.m,而命令文件无此要求。

(5)命令文件的变量在文件执行结束以后仍然保存在内存中而不会丢失,而函数文件的变量仅在函数运行期间有效(除非用global把变量说明成全局变量,否则函数文件中的变量均为局部变量),当函数运行完毕后,这些变量也就消失了。

需要说明的是,调用函数时所用的输入输出变量名并不要求与编写函数文件时所用的输入输出变量名相同。

【例2-25】函数文件的创建以及函数的调用。

(1)执行菜单命令FileNewscrept,弹出一个编辑框。

(2)在编辑框中输入如下代码:

>>function y=func(x)

if abs(x)<1

y=sqrt(1-x^2);

else

y=x^2-1;

end

此段代码对应于分段函数,如图2-4所示。

(3选择编辑框中的菜单命令FileSave,弹出对话框。注意,不要修改文件名,直接单击“保存”按钮。

(4)调用。在MATLAB的命令窗中输入命令:

>>fplot('func(x)',[-3,2])

运行结果如图2-5所示。

2.9 MATLAB 程序设计

在MATLAB中,提供了很多程序流程控制语句,如数据的输入输出、顺序结构、判断语句、分支语句、循环语句以及其他流程控制函数。

2.9.1 数据的输入和输出

MATLAB中提供的用于数据输入和输出的函数分别为input函数和disp函数,下面将对其进行介绍。

1.数据的输入

在MATLAB中,input函数用于实现数据的输入,该函数的调用格式为:

A=input (提示信息,选项)

其中,提示信息是一个字符串,用于提示用户输入什么样的数据。

A=input('A= ')

如果在input函数调用时采用's'选项,则允许用户输入一个字符串。例如,想输入一个人的姓名,可采用如下命令:

question = input ('What's your name?', 's')

2.数据的输出

在MATLAB中,disp函数用于实现数据的输出,该函数的调用格式为:

disp(输出项)

其中输出项既可以为字符串,也可以为矩阵。

当用disp函数显示矩阵时,将不显示矩阵的名字,而且其格式更紧密,且不留任何没有意义的空行。

【例2-26】求一元二次方程ax2+bx+c=0的根。

a=input('a=');

b=input('b=');

c=input('c=');

d=b*b-4*a*c;

x=[(-b+sqrt(d))/(2*a), (-b-sqrt(d))/(2*a)]

disp(['x1=',num2str(x(1)),',x2=',num2str(x(2))]);

2.9.2 顺序结构

顺序结构是最简单的程序结构,系统在编译程序时,按照程序的物理位置顺序执行。这种程序的优点是容易编制,缺点是结构单一、能够实现的功能有限。例如:

>>r=1;

h=1;

s=2*r*pi*h + 2*pi*r^2;

v=pi*r^2*h;

disp('The surface area of the colume is:'),disp(s);

disp('The volume of the colume is:'),disp(v);

运行结果如下:

The surface area of the colume is:

12.5664

The volume of the colume is:

3.1416

2.9.3 判断语句

在 MATLAB 中,判断语句可以使程序中的一段代码只在满足一定条件时才执行。if与else或elseif连用,偏向于是非选择,当某个逻辑条件满足时执行if后的语句,否则执行else语句。

1.结构为if…end

当程序只有一个判断语句时,可以选择if…end结构,此时程序结构为:

if 表达式

执行程序块

end

只有一个判断语句,其中的表达式为逻辑表达式,当表达式为真时,执行相应的语句,否则,直接跳到下一段语句。语句中的end是决不可少的,没有它,在逻辑表达式为0时,就找不到继续执行程序的入口。

【例2-27】判断输入的两个参数a和b是否都大于0,是则返回“a和b都大于0”,否则不返回,程序最后返回“否”。

>>a=input('a=');

b=input('b=');

if a > 0 & b>0

disp(' a 和b都大于0');

end

disp('否');

2.结构为if…else…end

当程序有两个选择时,可以选择 if…else…end 结构,此时程序结构为:

if 表达式

执行程序块1

else

执行程序块2

end

当判断表达式为真时,执行程序块1,否则执行程序块2。

【例2-28】判断输入的两个参数a和b是否都大于0,是则返回“a和b都大于0”,如果不全大于0,则显示“a和b不全都大于0”。

>>a=input('a=');

b=input('b=');

if a > 0 & b>0

disp(' a 和b都大于0');

else

disp(' a 和b不全都大于0');

end

下面的例子为分段函数值的计算。

>>x=input('请输入x的值:');

if x<=0

y= (x+sqrt(pi))/exp(3);

else

y=log(x+sqrt(1+x*x))/3;

end

3.结构为if…elseif…else…end

当程序的判断包含多个选择时,可以采用if…elseif…else…end结构,此时程序结构为:

if 表达式1

执行程序块1

elseif 表达式2

执行程序块2

elseif ...

...

...

else

执行程序块

end

其中,可以包含任意多个 elseif 语句。

【例2-29】判断输入学生成绩的所属等级:60以下不合格,60~70中等,70~89良好,90以上优秀。

>>n=input('input the score:')

if n>=0 & n<60

A='不合格'

elseif n>=60 & n<70

A='中等'

elseif n>=70 & n<89

A='良好'

elseif n>=90 &n<100

A='优秀'

else

A='输入错误'

end

2.9.4 分支语句

在MATLAB 中,还提供了的另一种多选择语句,即分支语句。分支语句的结构为:

switch 分支语句

case 条件语句

执行程序块

case {条件语句1, 条件语句2, 条件语句3, ...}

执行程序块

otherwise

执行程序块

end

其中,分支语句为一个变量(数值或者字符串变量),如果该变量的值与某一条件相符,则执行相应的语句,否则,执行 otherwise 后面的语句。在每一个条件中,可以包含一个条件语句,也可以包含多个条件,当包含多个条件时,以单元数组的形式表示条件。

【例2-30】任意底的对数的实现。

>>A=input('底');

B=input('对数值');

switch a

case exp(1)

y = log(B);

case 2

y = log2(B);

case 10

y = log10(B);

otherwise

y = log(B)/log(A);

end

【例2-31】某商场对顾客所购买的商品实行打折销售,标准为:小于200(没有折扣),200~500(5%折扣),500~1 000(8%折扣),1 000~2 500(15%折扣),2 500~5 000(20%折扣),大于等于5 000(25%折扣)。输入所售商品的价格,求其实际销售价格。

>>p=input('输入商品价格');

switch fix(p/100)

case {0,1}   %小于200

r=0;

case {2,3,4}  %200~500

r=5/100;

case num2cell(5:9)  % 500~1 000

r=8/100;

case num2cell(10:24) % 1 000~2 500

r=15/100;

case num2cell(25:49) % 2 500~5 000

r=20/100;

otherwise   %大于等于5 000

r=25/100;

end

p=p*(1-r)   %输出商品实际销售价格

2.9.5 for循环语句

在MATLAB中,for语句调用的基本格式如下:

for index=初值:增量:终值

语句组A

end

其中,A为循环体。

此语句表示把语句组A反复执行N次。循环次数N(需要预先指定)为:N=1+(终值-初值)/增量。在每次执行时程序中的index的值按“增量”增加。

【例2-32】用循环求解 1+2+…+99+100。

>>s=0;

for k=1:100

s=s+k;

end

计算的值。

>>s=0;

for k=1:100

s=s+1/2^(k+2);

end

2.9.6 for语句的嵌套

for语句的嵌套也称为循环的嵌套,或称为多重循环结构,是指一个循环结构的循环体又包括一个循环结构。

【例2-33】建立一个100阶数组,数组中的每一个元素A(k, n)满足A(k, n)=1/(k+n-1)。

>>for k=1:100

for n=1:100

A(k, n)=1/(k+n-1);

end

end

2.9.7 while 循环语句

在 MATLAB 中,while 语句用于将相同的程序块执行多次(次数不需要预先指定),当条件表达式为真时,执行程序块,直到条件表达式为假。

while 语句的结构为:

while 表达式

执行程序块

end

【例2-34】用循环求解最小的m,使其满足

>>s=0;

m=0;

while (s<=100)

m=m+1;

s=s+m;

end

2.10 本章小结

本章介绍了最基本、最具代表性的矩阵运算,其他的运算与之相似,读者可自行学习,熟练掌握。本章还简单地介绍了关系运算和逻辑运算、变量及表达式、符号运算、数据的输入和输出、M文件与M函数。最后本章又介绍了MATLAB程序控制相关知识,以为之后的图像处理编程打下基础。读者应该通过仔细阅读来掌握本章的重点内容。

相关图书

MATLAB完全自学教程
MATLAB完全自学教程
精通MATLAB数字图像处理与识别(第2版)
精通MATLAB数字图像处理与识别(第2版)
MATLAB App Designer从入门到实践
MATLAB App Designer从入门到实践
MATLAB 2020中文版从入门到精通
MATLAB 2020中文版从入门到精通
MATLAB机器学习
MATLAB机器学习
MATLAB/Simulink系统仿真超级学习手册 第2版
MATLAB/Simulink系统仿真超级学习手册 第2版

相关文章

相关课程