MATLAB神经网络超级学习手册

978-7-115-34948-4
作者: MATLAB技术联盟 刘冰 郭海霞
译者:
编辑: 王峰松

图书目录:

详情

本书以最新推出的MATLAB R2013a软件为基础,讲述了神经网络的主要内容,包括MATLAB及神经网络的概述、神经网络工具箱函数、前向型神经网络、反馈型神经网络、竞争型神经网络、神经网络的控制系统预测及诊断、神经网络图形用户接口、神经网络的Simulink和自定义神经网络等内容。本书在讲解时结合相关的函数或命令,精心编写了一些具体的示例,并在每章的小结中给出了软件使用的经验技巧等供读者参考。

图书摘要

工程软件应用精解

MATLAB神经网络超级学习手册
MATLAB技术联盟 刘冰 郭海霞 编著
人民邮电出版社

北京

图书在版编目(CIP)数据

MATLAB神经网络超级学习手册/刘冰,郭海霞编著.--北京:人民邮电出版社,2014.5

ISBN 978-7-115-34948-4

Ⅰ.①M… Ⅱ.①刘…②郭… Ⅲ.①人工神经网络—Matlab软件—手册 Ⅳ.①TP183-62

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

内容提要

本书以新近推出的 MATLAB R2013a 神经网络工具箱为基础,系统全面地介绍了神经网络的各种概念和应用。本书按逻辑编排,自始至终采用实例描述;内容完整且每章相对独立,是一本不可多得的掌握MATLAB神经网络的学习用书。

全书共分为16章,从MATLAB简介开始,详细介绍了MATLAB的基础知识、MATLAB程序设计、人工神经网络概述、感知器、线性神经网络、BP神经网络、RBF神经网络、反馈型神经网络、竞争型神经网络、神经网络在 Simulink 中的应用、神经网络 GUI、自定义神经网络及函数等内容。在本书最后,还详细介绍了神经网络在MATLAB中的几种应用方法。

本书以神经网络结构为主线,以学习算法为副线,结合各种实例,目的是使读者易看懂、会应用。本书是一本简明介绍MATLAB神经网络设计技能的综合性用书。本书深入浅出,实例引导,讲解详实,既可以作为高等院校理工科的研究生、本科生的教材,也可作为广大科研工程技术人员的参考用书。

◆编著 MATLAB技术联盟 刘冰 郭海霞

责任编辑 王峰松

责任印制 彭志环 杨林杰

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

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

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

北京隆昌伟业印刷有限公司印刷

◆开本:787×1092 1/16

印张:30

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

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

定价:69.00元

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

反盗版热线:(010)81055315

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

前言

MATLAB是国际上公认的最优秀的数值计算和仿真分析软件之一,并且具有很强的开放性。到目前为止,MATLAB平台已经推出了几十种针对不同应用的工具箱,其中为满足神经网络研究而开发的神经网络工具箱是其重要组成部分。

人工神经网络(Artificial Neural Network,ANN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型。神经网络由大量的人工神经元联结进行计算。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。大多数情况下,人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。

神经网络的研究可以分为理论研究和应用研究两大方面。在网络模型与算法研究的基础上,利用人工神经网络组成实际的应用系统,例如,完成某种信号处理或模式识别的功能,构建专家系统等。

本书基于MATLAB R2013a 软件详细讲解进行神经网络设计的方法和技巧,同时给出了MATLAB在神经网络方面的应用。

1.本书特点

由浅入深,循序渐进:本书以初中级读者为对象,首先从MATLAB使用基础讲起,再以神经网络在MATLAB中的应用案例帮助读者尽快掌握神经网络设计的技能。

步骤详尽,内容新颖:本书结合作者多年MATLAB神经网络使用经验与实际工程应用案例,将MATLAB软件的使用方法与技巧详细地讲解给读者。本书在讲解过程中步骤详尽、内容新颖,讲解过程辅以相应的图片,使读者在阅读时一目了然,从而快速把握书中所讲内容。

实例典型,轻松易学:学习实际工程应用案例的具体操作是掌握神经网络设计最好的方式。本书通过综合应用案例,透彻详尽地讲解了神经网络在各方面的应用。

2.本书内容

本书基于MATLAB R2013a 版软件,讲解了神经网络设计的基础知识和核心内容。本书主要分为两个部分:MATLAB基础知识和神经网络工具箱。

第1章 本章简单介绍了MATLAB 的基本知识,包括简介、特点、安装、工作环境等。对MATLAB软件的基本用途和方法也做了简单介绍。

第2章 本章对Simulink 做了简单介绍,包括simulink 基础以及Simulink 组成、工作原理和环境设置等。

第3章 本章介绍了MATLAB程序设计,包括MATLAB的程序结构、MATLAB 控制语句、数据的输入和输出、文件操作、程序优化和程序调试等内容。

第4章 本章介绍了人工神经网络,包括人工神经网络的基本概念、研究方向等。之后,介绍了神经网络的基本单元——神经元,并对神经网络结构和学习做了讲解,最后介绍了神经网络工具箱。

第5章 本章介绍了感知器,包括感知器的慨念、学习规则、局限性和工具箱的函数等,还对感知器在MATLAB中的仿真设计做了叙述。

第6章 本章介绍了线性神经网络的应用,包括线性神经网络原理、模型、工具箱函数、基本的设计方法及其设计案例。

第7章 本章主要介绍BP 神经网络原理,包括BP 神经网络的模型、算法、训练和功能等知识,还介绍了BP神经网络的设计方法、工具箱函数及典型工程应用案例。

第8章 本章主要介绍RBF 神经网络模型,包含其工作原理和具体实现,还介绍了RBF神经网络的学习算法、工具箱函数、非线性滤波及RBF在MATLAB中的应用实例。

第9章 本章主要介绍反馈型神经网络,包括反馈型神经网络的基本概念、Hopfield网络模型、Hopfield网络工具箱函数、离散型Hopfield网络和连续型Hopfield网络等,最后还对Elman网络进行了说明。

第10章 本章主要介绍竞争型神经网络,包括自组织型竞争神经网络、自组织特征映射神经网络、自适应共振理论神经网络、学习向量量化神经网络、竞争型神经网络工具箱函数和竞争型神经网络的应用等。

第11章 本章主要介绍神经网络在Simulink中的应用,包括Simulink中的神经网络模块、神经网络模型预测控制系统、反馈线性化控制系统和模型参考控制系统等。

第12章 本章主要介绍神经网络GUI 方面的知识,包括GUI 简介、常规神经网络GUI、神经网络拟合GUI、模式识别GUI和聚类GUI,最后还对GUI的数据操作进行了介绍。

第13章 本章主要介绍自定义神经网络的创建、网络初始化、训练和仿真等内容。因为自定义函数学习难度较大,本章只是简单介绍了自定义函数的种类。

第14章 本章主要介绍随机神经网络的基本思想,模拟退火算法和Boltzmann机算法,并举例用随机神经网络解决实际TSP问题。

第15章 本章主要运用简单的实例介绍了简单的神经网络应用,包括感知器神经网络、线性神经网络、BP神经网络和RBF神经网络的使用。

第16章 本章主要介绍BP 神经网络、PID神经网络控制、遗传算法优化、模糊神经网络和概率神经网络分类预测等5个典型的神经网络应用案例。

注:本书中用到的所有程序代码和数据,请到作者博客下载。

3.读者对象

本书适合于MATLAB神经网络设计初学者和期望提高神经网络工程应用能力的读者,具体说明如下。

★ 相关从业人员   ★ 初学MATLAB神经网络的技术人员

★ 大中专院校的教师和在校生 ★ 相关培训机构的教师和学员

★ 参加工作实习的“菜鸟” ★ 广大科研工作人员

4.本书作者

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

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

5.读者服务

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

编者

2013年秋

第1章 MATLAB简介

本章主要介绍MATLAB软件的基本用途和方法。MATLAB是目前在国际上被广泛接受和使用的科学与工程计算软件。虽然Cleve Moler教授开发它的初衷是为了更简单、更快捷地解决矩阵运算,但现在的MATLAB已经发展成为一种集数值运算、符号运算、数据可视化、图形界面设计、程序设计、仿真等多种功能于一体的集成软件。

本章将介绍MATLAB的发展、特点、安装、工作环境和MATLAB帮助系统,力图使读者能初步熟悉MATLAB软件的基本知识。

学习目标:

·了解MATLAB 的发展、特点和功能

·了解MATLAB 工具箱的概念和类型

·熟练掌握MATLAB 窗口的用途和使用方法

1.1 MATLAB的发展

20 世纪 70 年代中后期,曾在密西根大学、斯坦福大学和新墨西哥大学担任数学与计算机科学教授的 Cleve Moler 博士,为讲授矩阵理论和数值分析课程的需要,和同事用Fortran语言编写了两个子程序库EISPACK和LINPACK,这便是构思和开发MATLAB的起点。MATLAB 一词是对Matrix Laboratory(矩阵实验室)的缩写,由此可看出MATLAB与矩阵计算的渊源。

MATLAB除了利用EISPACK和LINPACK两大软件包的子程序外,还包含用Fortran语言编写的用于承担命令翻译的部分。

为进一步推动 MATLAB 的应用,在 20 世纪 80 年代初,John Little 等人将先前的MATLAB 全部用C 语言进行改写,形成了新一代的MATLAB。1984 年,Cleve Moler和John Little等人成立MathWorks公司,并于同年向市场推出了MATLAB的第一个商业版本。

随着市场接受度的提高,其功能也不断增强,在完成数值计算的基础上,新增了数据可视化以及与其他流行软件的接口等功能,并开始了对MATLAB工具箱的研究开发。

1993年,MathWorks公司推出了基于PC的以Windows为操作系统平台的MATLAB 4.0版。

1994年推出的4.2版,扩充了4.0版的功能,尤其在图形界面设计方面提供了新的方法。

1997 年推出的MATLAB 5.0 增加了更多的数据结构,如结构数组、细胞数组、多维数组、对象、类等,使其成为一种更方便的编程语言。

1999 年初推出的MATLAB 5.3 在很多方面又进一步改进了MATLAB 的功能。

2000年10 月底推出的全新的 MATLAB 6.0 正式版(Release 12),在核心数值算法、界面设计、外部接口、应用桌面等诸多方面有了极大的改进。

2002年8 月推出的MATLAB 6.5,其操作界面进一步集成化,并开始运用JIT 加速技术,使运算速度有了明显提高。

2004年7 月,MathWorks公司推出了MATLAB 7.0(Release l4),其中集成了MATLAB 7.0 编译器、Simulink 6.0图形仿真器及很多工具箱,在编程环境、代码效率、数据可视化、文件I/O等方面都进行了升级。

最近的一次版本更新是在2013年3月,Mathworks公司推出了MATLAB R2013a 版。该版本的新特点是引入Fixed-Point Designer,它结合Fixed-Point Toolbox、Simulink Fixed Point、 Phased Array System Toolbox 和 SimRF 的功能,增强了无线和雷达通信系统设计。R2013a还更新了80种其他产品,包括Polyspace嵌入式软件验证产品。

现在的MATLAB已经不再是仅仅解决矩阵与数值计算的软件,更是一种集数值与符号运算、数据可视化图形表示与图形界面设计、程序设计、仿真等多种功能于一体的集成软件。

观察由欧美引进的新版教材,MATLAB已经成为线性代数、数值分析计算、数学建模、信号与系统分析、自动控制、数字信号处理、通信系统仿真等一批课程的基本教学工具。而在国内,随着MATLAB在我国高校的推广和应用,MATLAB已经渐入人心。

1.2 MATLAB的特点及应用领域

MATLAB有两种基本的数据运算量:数组和矩阵,二者单从形式上不好区分。每一个变量可能被当作数组,也可能被当作矩阵,这要依靠所采用的运算法则或运算函数来定。

在MATLAB中,数组与矩阵的运算法则和运算函数是有区别的。但不论是MATLAB的数组还是MATLAB的矩阵,都已经改变了一般高级语言中使用数组的方式和解决矩阵问题的方法。

在MATLAB中,矩阵运算是把矩阵视为一个整体来进行,基本上与线性代数的处理方法一致。矩阵的加减乘除、乘方开方、指数对数等运算,都有一套专门的运算符或运算函数。

对于数组,不论是算术的运算,还是关系或逻辑的运算,甚至于调用函数的运算,形式上可以当作整体,有一套有别于矩阵的、完整的运算符和运算函数,但实质上却是针对数组的每个元素施行的。

当MATLAB把矩阵(或数组)当作一个独立的运算量来对待后,向下可以兼容向量和标量。不仅如此,矩阵和数组中的元素可以用复数作基本单元,向下可以包含实数集。这些是 MATLAB 区别于其他高级语言的根本特点。以此为基础,还可以概括出如下一些MATLAB的特色。

1.语言简洁,编程效率高

因为MATLAB定义了专门用于矩阵运算的运算符,使得矩阵运算就像列出算式执行标量运算一样简单,而且这些运算符本身就能执行向量和标量的多种运算。

利用这些运算符可使一般高级语言中的循环结构变成一个简单的MATLAB语句,再结合MATLAB丰富的库函数可使程序变得相当简短,几条语句即可代替数十行C语言或Fortran语言程序语句的功能。

2.交互性好,使用方便

使用C语言或Fortran语言的时候,首先需要编写源程序,然后对其进行编译、连接,待形成可执行文件后,方可运行程序得出结果。

而在MATLAB的命令窗口中,输入一条命令,立即就能看到该命令的执行结果,体现了良好的交互性。交互方式减少了编程和调试程序的工作量,给使用者带来了极大的方便。

3.强大的绘图能力,便于数据可视化

MATLAB不仅能绘制多种不同坐标系中的二维曲线,还能绘制三维曲面,体现了强大的绘图能力。正是这种能力为数据的图形化表示(即数据可视化)提供了有力工具,使数据的展示更加形象生动,有利于揭示数据间的内在关系。

4.领域广泛的工具箱,便于众多学科直接使用

MATLAB工具箱(函数库)可分为两类:功能性工具箱和学科性工具箱。功能性工具箱主要用来扩充其符号计算功能、图示建模仿真功能、文字处理功能以及与硬件实时交互的功能。而学科性工具箱是专业性比较强的工具箱,如优化工具箱、统计工具箱、控制工具箱、通信工具箱、图像处理工具箱、小波工具箱等。

5.开放性好,便于扩展

除内部函数外, MATLAB 的其他文件都是公开的、可读可改的源文件,体现了MATLAB的开放性特点。使用者可修改源文件和加入自己的文件,甚至构造自己的工具箱。

6.文件I/O和外部引用程序接口

支持读入更大的文本文件,支持压缩格式的MAT文件,用户可以动态加载、删除或者重载Java类等。正是由于以上几个特点,MATLAB的应用领域十分广阔,典型的应用举例如下。

·数据分析

·数值与符号计算

·工程与科学绘图

·控制系统设计

·航天工业

·生物医学工程

·汽车工业

·语音处理

·图像与数字信号处理

·财务、金融分析

·建模、仿真及样机开发

·新算法研究开发

1.3 MATLAB R2013a 的安装

MATLAB是一个功能强大的数学工具软件,只有在适当的系统环境中才能正常运行。本节介绍MATLAB R2013a 在PC 的Windows 操作系统中的典型安装方法。

提示:在本书的后面章节中,如果没有特别说明,所有的操作都是在 Windows XP操作系统下的MATLAB R2013a中进行的。

在一般情况下,当使用者将MATLAB R2013a 的安装光盘插入光驱后,会自动启动“安装向导”。如果向导没有自动启动,可以打开安装光盘中的 setup.exe 应用程序,启动安装向导。

在安装过程中出现的所有界面都是标准界面。用户只需要按照界面中的提示进行操作,输入用户名、单位名以及软件产品序列号等。下面介绍MATLAB R2013a 安装过程中的几个主要界面。

首先,使用者需要在安装界面中选择“自定义”选项才能自行选择软件安装的组件和目录等,如图1-1所示。

当选择“自定义”选项后,单击界面中的“下一步”按钮,就会出现MATLAB安装路径选择界面,如图1-2所示。使用者在选择MATLAB软件的安装位置和软件名称的时候,可以使用任意名称,同时也可以将MATLAB软件安装在硬盘中的任何位置。

建议:在安装路径名称中不要使用中文和空格符号,避免与其他软件可能出现的不兼容问题。

选择安装路径后继续单击“下一步”按钮,出现图 1-3 所示的产品选择界面,使用者可以在该界面中选择需要安装的组件。

在MATLAB组件选择界面下面的选框中,用户需要选择MATLAB软件的安装组件。可以直接勾选相应的组件,进行安装。默认情况下,系统会选中所有的组件,但是对于一般用户而言,很多组件的专业性过强,没有安装的必要。

为了帮助用户了解组件的构成,下面给出比较典型的组合方式,见表1-1。

当用户选择MATLAB的安装组件后,单击组件选择界面中的“下一步”按钮,就会出现确认安装界面,如图1-4(a)所示。

如果用户单击“安装”按钮,则MATLAB软件进入安装程序,如图1-4(b)所示。

1.4 MATLAB R2013a的工作环境

在一般情况下,可以使用两种方法来打开 MATLAB R2013a。在上节中,若已将快捷方式添加到桌面上,则可以双击桌面上的快捷方式图标,打开操作界面。

如果用户没有添加MATLAB快捷方式,则需要在MATLAB的安装文件夹里(默认路径为C:\Program Files\MATLAB\R2013a\bin\win32)选择MATLAB.exe 应用程序,同样可以打开MATLAB操作界面。这两种方法的结果完全相同。

1.4.1 操作界面简介

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

安装后首次启动MATLAB所得的操作界面如图1-5所示,这是系统默认的、未曾被用户依据自身需要和喜好设置过的界面。

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

菜单栏和工具栏在组成方式和内容上与一般应用软件基本相同,本章不再赘述。

1.4.2 Workspace(命令窗口)

在MATLAB默认主界面的中间是命令窗口。因为MATLAB至今未被汉化,所有窗口名都用英文表示,所以“Command Window”即指命令窗口。

命令窗口顾名思义是接收命令输入的窗口,但实际上,可输入的对象除MATLAB命令之外,还包括函数、表达式、语句以及M文件名或MEX文件名等,为叙述方便,本书后续部分将这些可输入的对象统称为语句。

MATLAB的工作方式之一是在命令窗口中输入语句,然后由MATLAB逐句解释执行并在命令窗口中给出结果。命令窗口可显示除图形以外的所有运算结果。命令窗口可从MATLAB主界面中分离出来,以便单独显示和操作,当然也可重新返回主界面中,其他窗口也有相同的行为。

分离命令窗口可以单击命令窗口右上角的按钮,在出现的下拉菜单中选择Undock选项,另外还可以直接用鼠标将命令窗口拖离主界面,其结果如图 1-6 所示。若将命令窗口返回到主界面中,可单击命令窗口右上角的按钮,在出现的下拉菜单中选择Dock选项。下面分几点对使用命令窗口的一些相关问题加以说明。

1.命令提示符和语句颜色

在分离的命令窗口中,每行语句前都有一个符号“>>”,此即命令提示符。在此符号后(也只能在此符号后)输入各种语句并按Enter键,方可被MATLAB接收和执行。执行的结果通常直接显示在语句下方。

不同类型语句用不同颜色区分。在默认情况下,输入的命令、函数、表达式以及计算结果等采用黑色字体,字符串采用红色,if、for等关键词采用蓝色,注释语句用绿色。

2.语句的重复调用、编辑和重运行

命令窗口不仅能编辑和运行当前输入的语句,而且对曾经输入的语句也有快捷的方法进行重复调用、编辑和运行。成功实施重复调用的前提是已输入的语句仍然保存在历史命令窗口中(未对该窗口执行清除操作)。而重复调用和编辑的快捷方法就是利用表1-2所列的键盘按键。

其实这些按键与文字处理软件中介绍的同一编辑键在功能上是大体一致的,不同点主要是:在文字处理软件中是针对整个文档使用,而MATLAB命令窗口是以行为单位使用这些编辑键,类似于编辑DOS命令的使用手法。

3.语句行中使用的标点符号

MATLAB 在输入语句时,可能要用到表 1-3 所列的各种符号,这些符号在 MATLAB中所起的作用见表1-3。

提示:在向命令窗口输入语句时,一定要在英文输入状态下输入,尤其在刚刚输完汉字后初学者很容易忽视中英文输入状态的切换。

4.命令窗口中数值的显示格式

为了适应用户以不同格式显示计算结果的需要,MATLAB设计了多种数值显示格式以供用户选用,见表1-4。其中默认的显示格式是:数值为整数时,以整数显示;数值为实数时,以short格式显示;如果数值的有效数字超出了这一范围,则以科学计数法显示结果。

需要说明的是,表中最后2个是用于控制屏幕显示格式的,而非数值显示格式。MATLAB所有数值均按IEEE浮点标准所规定的长型格式存储,显示的精度并不代表数值实际的存储精度,或者说数值参与运算的精度,认清这点是非常必要的。

5.数值显示格式的设定方法

格式设定的方法有两种:一是执行MATLAB工作栏中Preferences命令,用弹出的对话框去设定;二是执行 format 命令,例如要用 long 格式,在命令窗口中输入 format long语句即可。两种方法均可独立完成设定,但使用命令可方便在程序设计时进行格式设定。

不仅数值显示格式可由用户自行设置,数字和文字的字体显示风格、大小、颜色也可由用户自行挑选。其方法还是执行Preferences命令,弹出图1-7所示对话框。利用该对话框左侧的格式对象树,从中选择要设定的对象再配合相应的选项,便可对所选对象的风格、大小、颜色等进行设定。

6.命令窗口清屏

当命令窗口中执行过许多命令后,窗口会被占满,为方便阅读,清除屏幕显示是经常采用的操作。清除命令窗口显示通常有两种方法。

(1)执行MATLAB 工具栏的Clear Command→Command Window命令。

(2)在提示符后直接输入clc语句。

两种方法都能清除命令窗口中的显示内容,也仅仅是命令窗口的显示内容而已,并不能清除工作空间和历史命令窗口的显示内容。

1.4.3 Command History(历史命令窗口)

Command History(历史命令窗口)是MATLAB用来存放曾在命令窗口中使用过的语句的。它借用计算机的存储器来保存信息。其主要目的是为了便于用户追溯、查找曾经用过的语句,利用这些既有的资源节省编程时间。

单击历史命令窗口右上角的按钮,在出现的下拉菜单中选择Undock选项,可以将其从MATLAB主界面分离出来。另外还可以直接用鼠标将历史命令窗口拖离主界面,其结果如图 1-8 所示。从窗口中记录的时间来看,其中存放的正是曾经使用过的语句。

对历史命令窗口中的内容,可在选中的前提下,将它们复制到当前正在工作的命令窗口中,以供进一步修改或直接运行。其优势在如下两种情况下体现得尤为明显:一是需要重复处理长语句;二是在选择多行曾经用过的语句形成M文件时。

提示:如果只需要执行历史命令窗口中的单条语句,那么双击历史命令窗口中的该条语句即可。

1.复制、执行历史命令窗口中的命令

历史命令窗口的主要应用体现在表1-5中。表中操作方法一栏中提到的“选中”操作,与Windows选中文件时方法相同,同样可以结合Ctrl键和Shift键使用。

用历史命令窗口完成所选语句的复制操作的步骤如下。

(1)用鼠标选中所需第一行。

(2)再按Shift键和鼠标选择所需最后一行,于是连续多行即被选中。

(3)单击工具栏上图标,或在选中区域单击鼠标右键,执行快捷菜单的Copy命令。

(4)回到命令窗口,在该窗口用快捷菜单中的Paste命令,所选内容即被复制到命令窗口。其操作如图1-9所示。

用历史命令窗口完成所选语句的运行操作的步骤如下。

(1)用鼠标选中所需第一行。

(2)再按Ctrl键结合鼠标点选所需的行,于是不连续多行即被选中。

(3)在选中的区域右击弹出快捷菜单,选用Evaluate Selection 命令,计算结果就会出现在命令窗口中。

2.清除历史命令窗口中的内容。

清除历史命令窗口内容的方法就是执行 MATLAB 工具栏中的 Clear Command→Command History命令。

提示:当执行上述命令后,历史命令窗口当前的内容就被完全清除了,以前的命令再不能被追溯和利用。

1.4.4 输入变量

在MATLAB的计算和编程过程中,变量和表达式都是最基础的元素。如果用户需要深入学习MATLAB,十分有必要了解MATLAB关于定义变量和表达式的基本规定。

在MATLAB中,为变量定义名称需要满足下列规则。

(1)变量名称和函数名称有大小写区别。对于变量名称Mu和mu,MATLAB会认为是不同的变量。exp是MATLAB内置的指数函数名称。因此,如果用户输入exp(0),系统会得出结果 1;而如果用户输入 EXP(0),MATLAB 会显示错误的提示信息“Undefined function 'EXP' for input arguments of type 'double'.”,表明MATLAB无法识别EXP的函数名称,同时系统会提示是否需要输入exp(0),如图1-10所示。

(2)变量名称的第一个字符必须是英文字符。在MATLAB 6.5 以后的版本中,变量名称最多可以包含63个字符。因此,变量5xf、_mat等都是不合法的变量名称。

(3)变量名称中不可以包含空格或者标点符号。但是可以包括下划线。因此,变量名称xf_mat是合法的。

尽管MATLAB对于变量名称的限制较少,但还是建议用户在设置变量名称时考虑变量的含义。例如在M文件中,变量名称Outputname比名称a更好理解。

在上面的变量名称规则中,没有限制用户使用MATLAB的预定义变量名称,但是根据笔者的经验,还是建议用户不要使用MATLAB预先定义的变量名称。因为,用户每次启动MATLAB,系统就会自动产生这些变量,表1-6中列出了常见的预定义变量名称。

1.4.5 路径管理

MATLAB 借鉴 Windows 资源管理器管理磁盘、文件夹和文件的思想,设计了当前文件夹窗口。利用该窗口可组织、管理和使用所有MATLAB文件和非MATLAB文件,例如新建、复制、删除和重命名文件夹和文件。甚至还可用此窗口打开、编辑和运行M程序文件以及载入MAT数据文件等。当然,其核心功能还是设置当前文件夹。

Current Folder(当前文件夹窗口)如图1-11 所示。下面主要介绍当前文件夹的概念及如何完成对当前文件夹的设置,并不准备在此讨论程序文件的运行。

MATLAB的当前文件夹即是系统默认的实施打开、装载、编辑和保存文件等操作时的文件夹。用桌面图标启动MATLAB后,系统默认的当前目录是 …\MATLAB\work。

设置当前文件夹就是将此默认文件夹改变成用户希望使用的文件夹,它应是用户提前建立好的用来存放文件和数据的文件夹。

具体的设置方法有如下两种。

(1)在当前目录设置区设置。MATLAB主界面工具栏的右边以及分离的当前目录设置窗口都有当前目录设置区,可以在设置区的下拉列表文本框中直接填写待设置的文件夹名或选择下拉列表中已有的文件夹名。如果需要分离当前文件夹窗口,单击当前文件夹窗口右上角的按钮,在出现的下拉菜单中选择Undock选项即可。

(2)用命令设置。有一组从DOS中借用的文件夹命令可以完成这一任务,它们的语法格式见表1-7。

用命令设置当前文件夹,为在程序中控制当前目录的改变提供了方便,因为编写完成的程序通常用M文件存放,执行这些文件时是不便先退出再用窗口菜单或对话框去改变当前目录设置的。

1.4.6 搜索路径

MATLAB中大量的函数和工具箱文件是组织在硬盘的不同文件夹中的。用户建立的数据文件、命令和函数文件也是由用户存放在指定的文件夹中。当需要调用这些函数或文件时,找到这些函数或文件所存放的文件夹就成为首要问题,路径的概念也就因此而产生了。

路径其实就是给出存放某个待查函数和文件的文件夹名称。当然,这个文件夹名称应包括盘符和一级级嵌套的子文件夹名。

例如,现有一文件t04_06.m存放在D盘“MATLAB文件”文件夹下的“M文件”子文件夹下的“第 4 章”子文件夹中,那么,描述它的路径是:D:\MATLAB 文件\M 文件\第4章。若要调用这个M文件,可在命令窗口或程序中将其表达为:D:\MATLAB文件\M文件\第4章\t04_06.m。

在使用时,这种书写因为过长,很不方便,MATLAB为解决这一问题,引入了搜索路径机制。设置搜索路径机制就是将一些可能要被用到的函数或文件的存放路径提前通知系统,而无须在执行和调用这些函数和文件时输入一长串的路径。

提示:必须指出,不是说有了搜索路径,MATLAB对程序中出现的符号就只能从搜索路径中去查找。在 MATLAB 中,一个符号出现在程序语句里或命令窗口的语句中可能有多种解读,它也许是一个变量、特殊常量、函数名、M文件或MEX文件等,具体将其识别成什么,涉及搜索顺序的问题。

如果在命令提示符“>>”后输入符号xt,或程序语句中有一个符号xt,那么,MATLAB将试图按下列次序去搜索和识别。

(1)在MATLAB内存中进行检查搜索,看xt是否为工作空间窗口的变量或特殊常量,如果是,则将其当成变量或特殊常量来处理,不再往下展开搜索识别。

(2)上一步否定后,检查xt是否为MATLAB的内部函数,若肯定,则调用xt这个内部函数。

(3)上一步否定后,继续在当前文件夹中搜索是否有名为“xt.m”或“xt.mex”的文件存在,若肯定,则将xt作为文件调用。

(4)上一步否定后,继续在MATLAB搜索路径的所有目录中搜索是否有名为“xt.m”或“xt.mex”的文件存在,若肯定,则将xt作为文件调用。

(5)上述4步全走完后,仍未发现xt这一符号的出处,则MATLAB发出错误信息。必须指出的是,这种搜索是以花费更多执行时间为代价的。

MATLAB设置搜索路径的方法有两种:一种是用菜单和对话框;另一种是用命令。现将两方案分述如下。

1.用菜单和对话框设置搜索路径

在MATLAB主界面的File 菜单中有Set Path 命令,执行这一命令将打开设置搜索路径的对话框,如图1-12所示。

对话框左边设计了多个按钮,其中最上面的两个按钮分别是Add Folder…和 Add with Subfolders…,单击任何一个按钮都会弹出一个名为浏览文件夹的对话框,如图1-13所示。利用浏览文件夹对话框可以从树形目录结构中选择欲指定为搜索路径的文件夹。

Add Folder…和Add with Subfolders…两个按钮的不同处在于后者设置某个文件夹成为可搜索的路径后,其下级子文件夹将自动被加入到搜索路径中。

设置搜索路径对话框下面有两个按钮Save和Close,在使用时值得注意。Save按钮是用来保存对当前搜索路径所做修改的,通常先执行Save命令后,再执行Close。Close按钮是用来关闭对话框的,但是如果只想将修改过的路径为本次打开 MATLAB 使用,无意供MATLAB永久搜索,那么直接单击Close按钮,再在弹出的对话框中作否定回答即可。

2.用命令设置搜索路径

MATLAB能够将某一路径设置成可搜索路径的命令有两个:一个是 path;另一个是addpath。

针用path和addpath命令设置搜索路径的区别,下面举例说明。

>>path(path,'c:/tools/goodstuff')  %将路径放在路径表的前面

>>addpath('c:/matlab/myfiles','-end') %将路径放在路径表的后面

1.4.7 Workspace(工作空间)

在默认的情况下,工作空间浏览器位于MATLAB操作界面的右上方。单击Workspace窗口右上角的按钮,在出现的下拉菜单中选择Undock选项,可以将其从MATLAB主界面分离出来。另外还可以直接用鼠标将 Workspace 窗口拖离主界面,其结果如图 1-14所示。

当选中Workspace窗口中一个变量时,MATLAB界面菜单栏中的PLOTS选项就会激活,激活前后对比界面如图1-15所示。在图1-15(b)中,MATLAB强大的绘图功能有多种绘图方法供用户选择。

除了非常强大的绘图功能,Workspace 窗口还有许多其他应用功能,例如内存变量的查阅、保存和编辑等。所有这些操作都比较简单,只需要在 Workspace 窗口中选择相应的变量,然后右击鼠标,在弹出的快捷菜单中选择相应的菜单选项,如图1-16所示。

在MATLAB中,数组和矩阵都是十分重要的基础变量,因此MATLAB专门提供变量编辑器这个工具来编辑数据。

双击Workspace窗口中任意一个数组,就可以打开该数组的Variables窗口(变量编辑器),如图1-17所示。

用户可以在Variables窗口中直接编辑该变量。对于大型数组,使用变量编辑器会给用户带来很大的便利。

1.4.8 变量的编辑命令

在 MATLAB 中,用户除了可以在工作空间浏览器中编辑内存变量之外,还可以在MATLAB的命令窗口输入相应的命令,查阅和删除内存中的变量。下面用简单的案例,说明如何在命令窗口中对变量进行操作。

【例1-1】在MATLAB命令窗口中查阅内存变量。

解:具体步骤如下。

在命令窗口中输入who和whos命令,查看内存变量的信息,如图1-18所示。

注意:who和whos命令适用于MATLAB各种版本,两个命令的区别只在于内存变量信息的详细程度。两个命令结果的列表次序随具体情况而不同。

【例1-2】在例1-1之后,在MATLAB命令窗口中删除内存变量b。

在命令窗口中输入下面命令行。

>> clear b

>> who

得到的结果如图1-19所示。

和前面的例子相比,用户可以看出,当用户运行clear命令后,将b变量从工作空间删除,而且在工作空间浏览器中也将该变量删除。

1.4.9 存取数据文件

MATLAB提供了save和load命令来实现数据文件的存取。表1-8列出了命令的常见用法。

上表中列出了几个常见的文件存取命令,用户可以根据需要选择相应的存取命令;对于一些较少见的存取命令,用户可以查阅MATLAB帮助文件。

在MATLAB中,除了可以在命令窗口中输入相应的命令之外,也可以在工作空间中选择相应的按钮,实现数据文件的存取工作。例如,用户可以选择工具栏中的(save workspace)命令,将所有变量保存到mat文件中,如图1-20所示。

1.5 MATLAB R2013a的帮助系统

MATLAB的各个版本都为用户提供详细的帮助系统,可以帮助用户更好地了解和运用MATLAB。因此,不论用户是否用过 MATLAB,是否熟悉 MATLAB,都应该了解和掌握MATLAB 的帮助系统。同时,在MATLAB 6.0 版本以后,帮助系统的帮助方式和内容层次均相对之前的版本发生了本质变化,因此,用户更加有必要了解MATLAB R2013a 的帮助系统。在本节中,将详细介绍MATLAB R2013a的帮助系统。

1.5.1 纯文本帮助

在MATLAB中,所有执行命令或者函数的M源文件都有较为详细的注释。这些注释都是用纯文本的形式来表示的。一般都包括函数的调用格式或者输入函数、输出结果的含义。这些帮助是最原始的(相当于最底层的源文件)。当MATLAB不同版本中函数发生变化的时候,这些文本帮助也会同步更新。

下面使用简单的例子来说明如何使用MATLAB的纯文本帮助。

【例1-3】在MATLAB中查阅帮助信息。

解:根据MATLAB的帮助体系,用户可以查阅不同范围的帮助,具体步骤如下。

(1)在MATLAB的命令窗口输入help help命令,然后按Enter键,查阅如何在MATLAB中使用help命令,如图1-21所示。

操作界面显示了如何在MATLAB中使用help命令的帮助信息,用户可以详细阅读上面的信息来解决如何使用help命令。

(2)在MATLAB的命令窗口中输入help命令,然后按Enter键,查阅关于MATLAB系统中的所有主题的帮助信息,如图1-22所示。

(3)在MATLAB 的命令窗口中输入help topic 命令,然后按Enter 键,查阅关于该主题的所有帮助信息,如图1-23所示。

上面的步骤中,简单演示了如何在MATLAB中使用help命令,获得各种函数、命令的帮助信息。在实际应用中,用户可以灵活使用这些命令来搜索所需的帮助信息。

【例1-4】在 MATLAB 中搜索各命令的帮助信息,在M函数文件中搜索包含关键字jacobian的所有M函数文件名,如图1-24所示。

1.5.2 演示帮助

在MATLAB中,各个工具包都有设计好的演示程序,这组演示程序在交互界面中运行,操作非常简便。因此,运行这组演示程序,然后研究演示程序的相关M文件,对MATLAB用户而言是十分有益的。

这种演示功能对提高用户对 MATLAB 的应用能力有着重要作用。特别对于初学者而言,不需要了解复杂的程序就可以直观地查看程序结果,可以加强用户对MATLAB的掌握能力。

在 MATLAB 的命令窗口中输入“demo”命令,就可以调用关于演示程序的帮助对话框,如图1-25所示。

在上面的对话框中,单击可以显示出“demo帮助”的目录,如图1-26所示。用户可以在目录的左侧选择需要帮助的内容,也可以在图1-25中“On this page”选项中选择所需要的内容。

例如,在“On this page”选项中选择“Graphics”选项,帮助界面会显示到“Graphics”选项处,如图1-27所示。

单击图1-27中的“Line Plotting”选项,MATLAB 会打开Line Plotting 对话框,该对话框用于演示demo的交互界面,如图1-28所示。

演示该 demo 的是一个交互界面,用户可以调整该界面中图形的显示参数,这些修改的参数会出现在“Command Window”选项中,例如将Line Type 由默认的实线变为虚线,同时将Line Width 修改为3,修改后的结果如图1-29 所示。

选择图1-29中的Info 选项,可以得到Line Plotting 示例的帮助文档,如图1-30 所示。

用户除了可以在打开的动态界面中演示demo之外,还可以查看该demo的程序代码。在MATLAB的Command Window窗口中输入“open hndlgraf.m”,可以查看Line Plotting示例GUI界面的MATLAB程序代码,如图1-31。

除此之外,用户也可以在图1-32所示的MATLAB工具栏中,选择Help下拉菜单中的Examples选项打开MATLAB中的demo帮助界面。

1.5.3 帮助导航

在 MATLAB 中提供帮助信息的“帮助导航”交互界面是 MATLAB 6.0 以后的版本的重要改进,这个帮助文件和M文件中的纯文本帮助无关,而是MATLAB专门设置的独立帮助系统。该系统对MATLAB的功能叙述的全面、系统,而且界面友好,使用方便,是用户查找帮助的重要途径。

用户可以在MATLAB的命令窗口中输入命令“helpbrowser”或者“helpdesk”,或者在操作界面中单击按钮,打开“帮助导航”交互界面,如图1-33所示。

1.5.4 帮助文件目录窗

在默认情况下,当用户在 MATLAB 中打开“帮助导航”交互界面时,界面就会选择“Contents”选项卡。这个窗口中使用节点可展开的目录树来列出各种帮助信息,直接使用鼠标单击相应的目录条,就可以在浏览器中显示相应的标题的HTML帮助文件。

这个窗口是向用户提供全方位系统帮助的向导,层次清晰、功能划分规范,用户可以查找相应的帮助信息。例如,初学用户希望了解MATLAB,可以选择对话框中的“MATLAB”→“Getting Started with MATLAB”→“Tutorials”→“Array Indexing”选项,在浏览器中查看关于Array Indexing的帮助文件,如图1-34所示。

1.5.5 帮助文件索引窗

在MATLAB中,为了提高用户使用帮助文件的效率,专门为命令、函数和一些专用术语提供索引表。用户可以在交互界面中的搜索选项中输入需要查找的名称,在其下面就会出现与此匹配的词汇列表。

同时,在浏览器的界面显示相应的介绍内容。例如,在搜索选框中输入“cos”进行搜索,得到的结果如图1-35所示。

1.6 本章小结

MATLAB是一个功能多样的、高度集成的、适合科学和工程计算的软件,同时它又是一种高级程序设计语言。MATLAB的主界面集成了命令窗口、历史命令窗口、当前目录窗口和工作空间窗口等。它们既可单独使用,又可相互配合,为用户提供了十分灵活方便的操作环境。

对MATLAB各窗口的某项设置操作通常都有两条途径:一条是用MATLAB相关窗口的对话框或菜单(包括快捷菜单);另一条是在命令窗口执行某一命令。前者的优点是方便用户与MATLAB的交互,而后者主要是考虑到程序设计的需要和方便。

希望通过本章的内容,用户能够对MATLAB有一个直观的印象。在后面的章节中,将详细介绍关于MATLAB的基础知识和基础操作方法。

第2章 MATLAB基础

数据类型、常量与变量是MATLAB程序语言入门时必须引入的一些基本概念。数组是一种在高级语言中被广泛使用的构造型数据结构。在MATLAB中,为用户提供曲线拟合图形界面,用户可以在该界面上直接进行曲线拟合。

本章除了介绍以上内容外,还将简单介绍M文件中的一些概念。

学习目标:

·了解MATLAB 的数据类型、数组等基本概念

·熟练运用曲线拟合

·掌握M文件中的基本概念和简单使用

2.1 基本概念

数据类型、常量与变量是程序语言入门时必须引入的一些基本概念,MATLAB 虽是一个集多种功能于一体的集成软件,但就其语言部分而言,这些概念同样不可缺少。

本节除了引入这些概念之外,还将介绍诸如向量、矩阵、数组、运算符、函数和表达式等概念。

2.1.1 MATLAB数据类型概述

数据作为计算机处理的对象,在程序语言中可分为多种类型,MATLAB作为一种可编程的语言当然也不例外。MATLAB的主要数据类型如图2-1所示。

MATLAB数值型数据划分成整型和浮点型的用意和C语言有所不同。MATLAB的整型数据主要为图像处理等特殊的应用问题提供数据类型,以便节省空间或提高运行速度。对一般数值运算,绝大多数情况是采用双精度浮点型的数据。

MATLAB的构造型数据基本上与C++的构造型数据相衔接,但它的数组却有更加广泛的含义和不同于一般语言的运算方法。

符号对象是MATLAB所特有的一类为符号运算而设置的数据类型。严格地说,它不是某一类型的数据,它可以是数组、矩阵、字符等多种形式及其组合,但它在MATLAB的工作空间中的确又是另立的一种数据类型。

在使用中,MATLAB数据类型有一个突出的特点:在对不同数据类型的变量被引用时,一般不用事先对变量的数据类型进行定义或说明,系统会依据变量被赋值的类型自动进行类型识别,这在高级语言中是极有特色的。

提示:这样处理的好处是,在书写程序时可以随时引入新的变量而不用担心会出什么问题,给应用带来了很大方便。但缺点是有失严谨,会给搜索和确定一个符号是否为变量名带来更多的时间开销。

2.1.2 常量与变量

常量是程序语句中取不变值的量,如表达式 y=0.618*x,其中就包含一个0.618 这样的数值常数,它便是一数值常量。而另一表达式s='Tomorrow and Tomorrow'中,单引号内的英文字符串“Tomorrow and Tomorrow”则是一字符串常量。

在MATLAB中,有一类常量是由系统默认给定一个符号来表示的,例如 pi,它代表圆周率π这个常数,即3.1415926…,类似于C语言中的符号常量,这些特殊常量有时又称为系统预定义的变量,见表2-1。

变量是在程序运行中其值可以改变的量,变量由变量名来表示。在MATLAB中变量名的命名有自己的规则,可以归纳成如下几条。

(1)变量名必须以字母开头,且只能由字母、数字或者下画线3类符号组成,不能含有空格和标点符号(如( ),。%)等。

(2)变量名区分字母的大小写。例如,“a”和“A”是不同的变量。

(3)变量名不能超过63个字符,第63 个字符后的字符被忽略,对于MATLAB 6.5 版以前的变量名不能超过31个字符。

(4)关键字(如if、while等)不能作为变量名。

(5)最好不要用表2-1中的特殊常量符号作变量名。

2.1.3 标量、向量、矩阵与数组

标量、向量、矩阵和数组是MATLAB运算中涉及的一组基本运算量。它们各自的特点及相互间的关系可以描述如下。

(1)数组不是一个数学量,而是一个用于高级语言程序设计的概念。如果数组元素按一维线性方式组织在一起,那么称其为一维数组,一维数组的数学原型是向量。

如果数组元素分行、列排成一个二维平面表格,那么称其为二维数组,二维数组的数学原型是矩阵。

如果元素在排成二维数组的基础上,再将多个行、列数分别相同的二维数组叠成一个立体表格,便形成三维数组。依此类推下去,便有了多维数组的概念。

说明:在 MATLAB 中,数组的用法与一般高级语言不同,它不借助于循环,而是直接采用运算符,有自己独立的运算符和运算法则。

(2)矩阵是一个数学概念,一般高级语言并未引入将其作为基本的运算量,但 MATLAB 是个例外。

一般高级语言是不认可将两个矩阵视为两个简单变量而直接进行加减乘除的,要完成矩阵的四则运算必须借助于循环结构。当MATLAB将矩阵引入作为基本运算量后,运算方式并没有完全遵守上述规定。MATLAB不仅实现了矩阵的简单加减乘除运算,而且许多与矩阵相关的其他运算也因此大大简化了。

(3)向量是一个数学量,一般高级语言中也未引入,它可视为矩阵的特例。从MATLAB的工作空间窗口可以查看到:一个n维的行向量是一个1×n 阶的矩阵,而列向量则当成n×1阶的矩阵。

(4)标量的提法也是一个数学概念,但在MATLAB中,一方面可将其视为一般高级语言的简单变量来处理,另一方面又可把它当成1×1阶的矩阵,这一看法与矩阵作为MATLAB的基本运算量是一致的。

(5)在MATLAB中,二维数组和矩阵其实是数据结构形式相同的两种运算量。二维数组和矩阵的表示、建立、存储根本没有区别,区别只在它们的运算符和运算法则不同。

例如,向命令窗口中输入a=[1 2;3 4]这个量,实际上它有两种可能的角色:矩阵a或二维数组 a。这就是说,单从形式上是不能完全区分矩阵和数组的,必须再看它使用什么运算符与其他量之间进行运算。

(6)数组的维和向量的维是两个完全不同的概念。数组的维是从数组元素排列后所形成的空间结构去定义的:线性结构是一维,平面结构是二维,立体结构是三维,当然还有四维以至多维。向量的维相当于一维数组中的元素个数。

下面介绍几个向量和矩阵的代数运算示例。

【例2-1】向量点积运算。

解:在MATLAB的Command Window窗口输入以下命令。

>> A=1:10;

>> B=linspace(1,10,10);

>> AT=A';

>> BT=B';

>> e=dot(A,B)

>> f=dot(AT,BT)

其运算结果如下。

e =

385

f =

385

在数学描述中,向量A、B的叉积是一新向量C,C的方向垂直于A与B所决定的平面。

【例2-2】合法向量叉积运算。

解:在Command Window窗口输入以下命令。

>>A=1:3,

>>B=3:5

>>E=cross(A,B) %该函数计算的是A、B叉积后各分量的元素值,且A、B只能是三维向量

其运算结果如下。

A =

1 2 3

B =

3 4 5

E =

-2 4  -2

【例2-3】求给定矩阵的行列式值。

解:在Command Window窗口输入以下命令并得到其结果如下所示。

>> A=[3 2 4;1 -1 5;2 -1 3],D1=det(A)

A =

3    2    4

1     -1    5

2     -1    3

D1 =

24

>> B=ones(3),D2=det(B),C=pascal(4),D3=det(C)

B =

1    1    1

1    1    1

1    1    1

D2 =

0

C =

1    1    1    1

1    2    3    4

1    3    6   10

1    4   10   20

D3 =

1

【例2-4】已知矩阵,求A+B,2A,2A−3B,AB。

解:在Command Window窗口输入以下命令。

>> A=[1 3;2 -1];

>>B=[3 0;1 2];

得到结果如下所示。

>> A+B

ans =

4    3

3    1

>> 2*A

ans =

2    6

4     -2

因为矩阵加减运算的规则是对应元素相加减,所以参与加减运算的矩阵必须是同阶矩阵。数与矩阵的加减乘除的规则很简单,但矩阵相乘有定义的前提是两矩阵内阶相等。

2.1.4 运算符

MATLAB运算符可分为3大类,即算术运算符、关系运算符和逻辑运算符。下面分类给出它们的运算符和运算法则。

1.算术运算符

算术运算因所处理的对象不同,分为矩阵和数组算术运算两类。表 2-2 给出的是矩阵算术运算的符号、名称、示例和使用说明,表 2-3 给出的是数组算术运算的符号、名称、示例和使用说明。

针对表2-2和表2-3需要说明以下几点。

(1)矩阵的加、减、乘运算是严格按矩阵运算法则定义的,而矩阵的除法虽和矩阵求逆有关系,但却分了左、右除,因此不是完全等价的。乘幂运算更是将标量幂扩展到矩阵可作为幂指数。总的来说,MATLAB接受了线性代数已有的矩阵运算规则,但又不仅止于此。

(2)表 2-3 中并未定义数组的加减法,是因为矩阵的加减法与数组的加减法相同,所以未做重复定义。

(3)不论是加减乘除,还是乘幂,数组的运算都是元素间的运算,即对应下标元素一对一的运算。

(4)多维数组的运算法则,可依元素按下标一一对应参与运算的原则将表2-3推广。

2.关系运算符

MATLAB关系运算符列在表2-4中。

需要明确指出的是,MATLAB的关系运算虽可看成矩阵的关系运算,但严格地讲,把关系运算定义在数组基础之上更为合理。因为从表 2-4 所列法则不难发现,关系运算是元素一对一的运算结果。数组的关系运算向下可兼容一般高级语言中所定义的标量关系运算。

3.逻辑运算符

逻辑运算在MATLAB中同样需要,为此MATLAB定义了自己的逻辑运算符,并设定了相应的逻辑运算法则,见表2-5。

同样地,MATLAB的逻辑运算也是定义在数组的基础之上,向下可兼容一般高级语言中所定义的标量逻辑运算。为提高运算速度,MATLAB还定义了针对标量的先决与和先决或运算。

先决与运算是当该运算符的左边为1(真)时,才继续与该符号右边的量做逻辑运算。先决或运算是当运算符的左边为1(真)时,就不需要继续与该符号右边的量做逻辑运算,而立即得出该逻辑运算结果为1(真);否则,就要继续与该符号右边的量运算。

4.运算符的优先级

和其他高级语言一样,当用多个运算符和运算量写出一个MATLAB表达式时,运算符的优先次序是一个必须明确的问题。表2-6列出了运算符的优先次序。

MATLAB运算符的优先次序在表2-6中依从上到下的顺序,分别由高到低。而表中同一行的各运算符具有相同的优先级,而在同一级别中又遵循有括号先括号运算的原则。

2.1.5 命令、函数、表达式和语句

有了常量、变量、数组和矩阵,再加上各种运算符即可编写出多种MATLAB的表达式和语句。但在MATLAB的表达式或语句中,还有一类对象会时常出现,那便是命令和函数。

1.命令

命令通常就是一个动词,在第1章中已经有过接触,例如clear命令,用于清除工作空间。还有的可能在动词后带有参数,例如“addpath F:\MATLAB 文件\M文件-end”命令,用于添加新的搜索路径。在 MATLAB 中,命令与函数都组织在函数库里,函数库 general就是专门用来存放通用命令的。一个命令也是一条语句。

2.函数

函数对MATLAB而言,有相当特殊的意义,这不仅因为函数在MATLAB中应用面广,更在于其种类和数量多。仅就MATLAB的基本部分而言,其所包括的函数类别就达二十多个,而每一类中又有少则几个,多则几十个函数。

除了基本部分之外,还有各种工具箱,而工具箱实际上也是由一组组用于解决专门问题的函数构成。不包括MATLAB网站上外挂的工具箱函数,就目前MATLAB自带的工具箱已多达几十种,可见MATLAB其函数之多。从某种意义上说,函数就代表了MATLAB, MATLAB全靠函数来解决问题。

函数最一般的引用格式如下。

函数名(参数1,参数2,…)

例如,引用正弦函数就书写成sin(A),A就是一个参数,它可以是一个标量,也可以是一个数组,而对数组求其正弦是针对其中各元素求正弦,这是由数组的特征决定的。

3.表达式

用多种运算符将常量、变量(含标量、向量、矩阵和数组等)、函数等多种运算对象连接起来构成的运算式就是MATLAB的表达式。

例如,A+B&C−sin(A·pi)就是一个表达式。请分析它与表达式(A+B)&C−sin(A·pi)有无区别。

4.语句

在MATLAB中,表达式本身即可视为一个语句。而典型的MATLAB语句是赋值语句,其一般的结构如下。

变量名=表达式

例如,F=(A+B)&C−sin(A·pi)就是一个赋值语句。

除赋值语句外,MATLAB还有函数调用语句、循环控制语句、条件分支语句等。这些语句将会在后面章节逐步介绍。

2.2 MATLAB中的数组

MATLAB中数组可以说无处不在,任何变量在MATLAB中都是以数组形式存储和运算的。按照数组元素个数和排列方式,MATLAB中的数组可以分为以下几种。

·没有元素的空数组(empty array)。

·只有一个元素的标量(scalar),它实际上是一行一列的数组。

·只有一行或者一列元素的向量(vecor),分别叫做行向量和列向量,也统称为一维数组。

·普通的具有多行多列元素和二维数组。

·超过二维的多维数组(具有行、列、页等多个维度)。

按照数组的存储方式,MATLAB中的数组可以分为:普通数组和稀疏数组(常称为稀疏矩阵)。稀疏矩阵适用于那些大部分元素为0,只有少部分非零元素的数组的存储。主要是为了提高数据存储和运算的效率。

2.2.1 数组的保存和装载

许多实际应用中的数组都是很庞大的,而且当操作步骤较多,不能在短期内完成,需要多次分时进行时,这些庞大的数组的保存和装载就是一个重要问题了,因为每次在进行操作前对数组进行声明和赋值,需要很庞大的输入工作量,一个好的解决方法是将数组保存在文件中,每次需要时进行装载。

MATLAB中提供了内置的把变量保存在文件中的方法,最简单易用的是将数组变量保存为二进制的.mat文件,用户可以通过save命令将工作区中指定的变量存储在.mat文件中。

(1)save命令的一般语法如下。

save <filename><var1><var2>…<varN>

其作用是把var1 var2…varN指定的工作区变量存储在filename指定名称的.mat文件中。

通过save存储到.mat文件中的数组变量,在使用前可以用load命令装载到工作区。

(2)load命令的一般语法如下。

load <filename><var1><var2>…<varN>

其作用是把当前目录下存储在filename.mat 文件中的var1 var2…varN指定的变量装载到MATLAB工作区中。

2.2.2 数组索引和寻址

数组操作中最频繁遇到的就是对数组的某个具体位置上的元素进行访问和重新赋值。这涉及定位数组中元素的位置,也就是数组索引和寻址的问题。

MATLAB中数组元素的索引方式包括数字索引和逻辑索引两类。

1.数字索引方式

MATLAB中,普通二维数组元素的数字索引方式又可以分为两种:双下标(也叫全下标)索引和单下标索引。

双下标索引方式,顾名思义,就是用两个数字(自然数)来定位元素的位置。实际上就是用一个有序数对来表征元素位置,第一个数字指定元素所在的行位置,第二个数字指定元素所在的列。两个表示元素位置的索引数字之间用逗号分隔,并用圆括号括起来,紧跟在数组变量名后,就可以访问此数字索引指定的位置上的数组元素了。

例如,对于3行2列的数组A,A(3,1)表示数组A的第3行第1列的元素,A(1,2)表示数组A的第1行第2列的元素。

相应地,单下标索引方式就是用一个数字来定位数组元素。实际上,单下标索引和双下标索引是一一对应的,对一个已知尺寸的数组,任一个单下标索引数字都可以转换成确定的双下标索引。对于m 行n 列的数组A,A(x,y)实际上对应于A((y−1)·m+x)。

例如,对于3行2列的数组A,A(3,1)用单下标索引表示就是A(3),A(1,2)用单下标索引表示就是A(4)。

MATLAB中单下标索引方式实际上采用了列元素优先的原则,即对于m行n列的数组A,第一列的元素的单下标索引依次为A(1),A(2),A(3),…,A(m)。第二列的元素的单下标索引依次为A(m+1),A(m+2),A(m+3),…,A(2m),依此类推。

这两种数字索引方式中的数字索引也可以是一个数列,从而实现访问多个数组元素的目的,这通常可以通过运用冒号或一维数组来实现。

【例2-5】数组元素的索引与寻址。

解:在Command Window窗口输入以下命令。

>>A=[42 56;31 7 0;1245 7823] %创建数组

A =

4 2 5 6

3 1 7 0

12 45 78 23

>>A(2,3)     %双下标索引访问数组第2行第3列元素

ans =

7

>>A(7)=100    %对数组第7个元素(即第1行第3列)重新赋值

A =

4 2 100 6

3 1 7 0

12 45 78 23

通过例题可以看到,利用下标索引的方法,用户可以访问特定位置上的数组元素的值,或者对特定位置的数组元素重新赋值。

2.单下标索引和双下标索引的转换

单下标索引和双下标索引之间,可以通过MATLAB提供的函数进行转换。

把双下标索引转换为单下标索引,需要用sub2ind命令,其语法如下。

IND=sub2ind(siz,I,J)

其中siz是一个1行2列的数组,指定转换数组的行列尺寸,一般可以用size(A)来表示:I和J分别是双下标索引中的两个数字;IND则为转换后的单下标数字。

把单下标索引转换为双下标索引,需要用ind2sub命令,其语法如下。

[I,J]= ind2sub(siz,IND)

各变量意义同上。

【例2-6】单-双下标转换。

解:在命令窗口输入以下命令。

>> A=rand(3,5)

A =

0.6948 0.0344 0.7655 0.4898 0.7094

0.3171 0.4387 0.7952 0.4456 0.7547

0.9502 0.3816 0.1869 0.6463 0.2760

>> IND=sub2ind(size(A),2,4)

IND =

11

>> A(IND)

ans =

0.4456

>> [I,J]=ind2sub(size(A),13)

I =

1

J =

5

可以看到,sub2ind函数和ind2sub函数实现了单-双下标的转换,需要注意的是,ind2sub函数需要指定两个输出参数的接收变量。但由于 MATLAB 中小写字母 i,j 默认是用作虚数单位,因此最好是不用小写字母i,j来接收转换后的下标数字。

3.逻辑索引方式

除了这种双下标和单下标的数字索引外,MATLAB中访问数组元素,还可以通过逻辑索引的方式,通常是通过比较关系运算产生一个满足比较关系的数组元素的索引数组(实际上是一个由0,1组成的逻辑数组),然后利用这个索引数组来访问原数组,并进行重新赋值等操作。

【例2-7】逻辑索引。

解:在命令窗口输入以下命令。

>>A=rand(5)   %创建数组

A =

0.6797 0.9597 0.2551 0.5472 0.2543

0.6551 0.3404 0.5060 0.1386 0.8143

0.1626 0.5853 0.6991 0.1493 0.2435

0.1190 0.2238 0.8909 0.2575 0.9293

0.4984 0.7513 0.9593 0.8407 0.3500

>>B=A>0.8   %通过比较关系运算产生逻辑索引

B =

0 1 0 0 0

0 0 0 0 1

0 0 0 0 0

0 0 1 0 1

0 0 1 1 0

>>A(B)=0    %通过逻辑索引访问原数组元素,并重新赋值

A =

0.6797  0 0.2551 0.5472 0.2543

0.6551 0.3404 0.5060 0.1386  0

0.1626 0.5853 0.6991 0.1493 0.2435

0.1190 0.2238  0 0.2575  0

0.4984 0.7513  0  0 0.3500

2.2.3 数组的扩展和裁剪

在许多操作过程中,需要对数组进行扩展或剪裁,数组扩展是指在超出数组现有尺寸的位置添加新元素;裁剪是指从现有数据中提取部分,产生一个新的小尺寸的数组。

1.Array Editor(变量编辑器)

Array Editor 是 MATLAB 提供的对数组进行编辑的交互式图形界面工具。双击MATLAB 默认界面下工作区面板下的某一变量,都能打开 Array Editor,从而进行数组元素的编辑。

Array Editor界面类似于电子表格界面,每一个单元格就是一个数组元素。当单击超出数组当前尺寸的位置的单元格,并输入数据赋值时,实际上就是在该位置添加数组元素,即进行了数组的扩展操作,如图2-2所示。

通过鼠标双击Workspace窗口下的2行2列的数组变量A,打开数组A的编辑器界面,如图2-2所示。

在其他位置单击鼠标或者按Enter键,都可以使当前扩展操作即刻生效。如图2-3所示,在第6行第6列的位置单击单元格并输入数值2,数组A被扩展为6行6列的数组,原有元素不变,在第6行第6列的位置赋值为2,其他扩展的位置上元素被默认赋值为0。

通过Array Editor也可以裁减数组,这主要是对数组行、列的增加或删除操作,该操作需要通过鼠标右键菜单来实现。在Array Editor 中单击某单元格后,单击鼠标右键,弹出图2-4所示菜单。

在图2-4所示的菜单中,选择删除子菜单“Delete…”,就可以指定删除当前数组中选定位置元素所在的整行或者整列。图2-5所示为删除第2行数据之后的数组A。

提示:如果想删除数组中单独一个值,可以选择图2-4中的“Cut”命令。

图形用户界面的Array Editor使用简单,但如果对数组的扩展或裁剪操作实际比较复杂时,通过Array Editor实现是比较繁琐低效的。

2.数组扩展的cat函数

MATLAB中可以通过cat系列函数将多个小尺寸数组按照指定的连接方式,组合成大尺寸的数组。这些函数包括:cat,horzcat和vertcat。

cat函数可以按照指定的方向将多个数组连接成大尺寸数组。其基本语法格式如下。

C=cat(dim,A1,A2,A3,A4,…),dim用于指定连接方向,对于两个数组的连接,cat(1,A,B)实际上相当于[A;B],近似于把两个数组当作两个列元素连接。

horzcat(A1,A2,…)是水平方向连接数组,相当于 cat(A1,A2,…);vercat(A1,A2,…)是垂直方向连接数组,相当于cat(1,A1,A2,…)。

不管哪个连接函数,都必须保证被操作的数组可以被连接,即在某个方向上尺寸一致,如horzcat函数要求被连接的所有数组都具有相同的行数,而vercat函数要求被连接的所有数组都具有相同的列数。

【例2-8】通过cat函数扩展数组。

解:在Commond Window窗口输入以下命令。

>> A=rand(3,5)

A =

0.1966 0.4733 0.5853 0.2858 0.3804

0.2511 0.3517 0.5497 0.7572 0.5678

0.6160 0.8308 0.9172 0.7537 0.0759

>> B=eye(3)

B =

1 0 0

0 1 0

0 0 1

>> C=magic(5)

C =

17 24 1 8 15

23 5 7 14 16

4 6 13 20 22

10 12 19 21 3

11 18 25 2 9

>> cat(1,A,B)   %列数不同,不能垂直连接

Error using cat

CAT arguments dimensions are not consistent.

>> cat(2,A,B)   %行数相同,可以水平连接

ans =

0.1966 0.4733 0.5853 0.2858 0.3804 1.0000  0  0

0.2511 0.3517 0.5497 0.7572 0.5678  0 1.0000  0

0.6160 0.8308 0.9172 0.7537 0.0759  0  0 1.0000

3.块操作函数

MATLAB中还有通过块操作实现数组扩展的函数。

(1)数组块状赋值函数repmat。

repmat(A,m,n)可以将a行b列的元素A当作“单个元素”,扩展出m行n列个由此“单个元素”组成的扩展数组,实际上新产生的数组共有m·a行,n·b 列。

【例2-9】使用块状复制函数repmat。

解:在Commond Window窗口输入以下命令。

>> A=eye(2)

A =

1 0

0 1

>> repmat(A,2,2)

ans =

1 0 1 0

0 1 0 1

1 0 1 0

0 1 0 1

(2)对角块生成函数blkdiag。

blkdiag(A,B,…)将数组A,B等当作“单个元素”,安排在新数组的主对角位置,其他位置用零数组块进行填充。

【例2-10】使用对角块生成函数blkdiag。

解:在Commond Window窗口输入以下命令。

>> A=eye(2)

A =

1 0

0 1

>> B=ones(2,3)

B =

1 1 1

1 1 1

>> blkdiag(A,B)

ans =

1 0 0 0 0

0 1 0 0 0

0 0 1 1 1

0 0 1 1 1

(3)块操作函数kron。

kron(X,Y)把数组Y当作一个“元素块”,先复制扩展出size(X)规模的元素块,然后每一个块元素与X的相应位置的元素值相乘。

例如,对 2 行 3 列的数组 X 和任意数组 Y,kron(X,Y)返回的数组相当于[X(1,1)·Y X(1,2)·Y X(1,3)·Y;X(1,3)·Y X(2,2)·Y X(2,3)·Y]。

【例2-11】使用块操作函数kron。

解:在Commond Window窗口输入以下命令。

>> A=[0 1;1 2]

B=magic(2)

C=kron(A,B)

A =

0 1

1 2

B =

1 3

4 2

C =

0 0 1 3

0 0 4 2

1 3 2 6

4 2 8 4

4.索引扩展

索引扩展是对数组进行扩展中最常用也最易用的方法。前面讲到索引寻址时,其中的数字索引有一定的范围限制,比如m行n列的数组A,要索引寻址访问一个已有元素,通过单下标索引A(a)访问就要求a<=m,b<=n,因为A只有m行n列。

但索引扩展中使用的索引数字,就没有这些限制;相反,必然要用超出上述限制的索引数字,来指定当前数组尺寸外的一个位置,并对其进行赋值,以完成扩展操作。

通过索引扩展,一条语句只能增加一个元素,并同时在未指定的新添位置上默认赋值为 0,因此,要扩展多个元素就需要组合运用多条索引扩展语句,并且经常也要通过索引寻址修改特定位置上被默认赋值为0的元素。

【例2-12】索引扩展。

解:在Commond Window窗口输入以下命令。

>> A=eye(3)

A =

1 0 0

0 1 0

0 0 1

>>A(4,6)=25    %索引扩展

A =

1 0 0 0 0 0

0 1 0 0 0 0

0 0 1 0 0 0

0 0 0 0 0 25

通过例2-12可见,组合应用索引扩展和索引寻址重新赋值命令,在数组的索引扩展中是经常会遇到的。

5.通过冒号操作符裁剪数组

相对于数组扩展这种放大操作,数组的裁剪就是产生新的子数组的缩小操作,从已知的大数据集中挑出一个子集合,作为新的操作对象,这在各种应用领域都是常见的。

MATLAB中裁剪数组,最常用的就是冒号操作符,实际上,冒号操作符实现裁剪功能时,其意义和冒号用于创建一维数组的意义是一样的,都是实现一个递变效果。

例如,从100行100列的数组A中挑选偶数行偶数列的元素,相对位置不变的组成50行50列的新数组B,只需要通过B=A(2:2:100,2:2:100)就可以实现,实际上这是通过数组数字索引实现了部分数据的访问。

更一般的裁剪语法如下。

B=A([a1,a2,a3,…], [b1,b2,b3,…])

表示提取数组A的a1,a2,a3,…等行,b1,b2,b3,…等列的元素组成子数组B。

此外,冒号还有一个特别的用法。当通过数字索引访问数组元素时,如果某一索引位置上不是用数字表示,而是用冒号代替,则表示这一索引位置可以取所有可以取到的值。例如对5行3列的数组A,A(3,:)表示取A的第三行所有元素(从第1行到第3列),A(:,2)表示取A的第二列的所有元素(从第1行到第5行)。

【例2-13】数组裁剪。

解:在Commond Window窗口输入以下命令。

>> A=magic(8)

A =

64 2 3 61 60 6 7 57

9 55 54 12 13 51 50 16

17 47 46 20 21 43 42 24

40 26 27 37 36 30 31 33

32 34 35 29 28 38 39 25

41 23 22 44 45 19 18 48

49 15 14 52 53 11 10 56

8 58 59 5 4 62 63 1

>>A(1:3:5,3:7)  %提取数组A的第1、3、5行,3到7列的所有元素

ans =

3 61 60 6 7

46 20 21 43 42

35 29 28 38 39

6.数组元素删除

通过部分删除数组元素,也可以实现数组的裁剪,删除数组元素很简单,只需要对该位置元素赋值为空方括号([])即可。一般配合冒号,将数组的某些行、列元素删除。但是注意,进行删除时,索引结果必须是完整的行或完整的列,而不能是数组内部的块或单元格。

【例2-14】数组元素删除。

解:在Commond Window窗口输入以下命令。

>> A=magic(7)

A =

30 39 48 1 10 19 28

38 47 7 9 18 27 29

46 6 8 17 26 35 37

5 14 16 25 34 36 45

13 15 24 33 42 44 4

21 23 32 41 43 3 12

22 31 40 49 2 11 20

>> A(1:3:8,:)=[]

A =

38 47 7 9 18 27 29

46 6 8 17 26 35 37

13 15 24 33 42 44 4

21 23 32 41 43 3 12

通过例2-14可见,数组元素的部分删除是直接在原始数组上进行的操作,在实际应用中,要考虑在数组元素删除前要不要先保存一个原始数组的拷贝,避免不小心造成对原始数据的破坏。另外,单独的一次删除操作只能删除某些行或某些列,因此一般需要通过两条语句才能实现行列两个方向的数组元素删除。

MATLAB中有大量内部函数可以对数组进行改变形状的操作,包括数组转置,数组平移和旋转,以及数组尺寸的重新调整。

2.2.4 数组形状的改变

MATLAB中有大量内部函数可以对数组进行改变形状的操作,包括数组转置,数组平移和旋转,以及数组尺寸的重新调整。

1.数组的转置

MATLAB中进行数组转置最简单的是通过转置操作符(’)。需要注意以下几个方面。

(1)对于有复数元素的数组,转置操作符(’)在变化数组形状的同时,也会将复数元素转化为其共轭复数。

(2)如果要对复数数组进行非共轭转置,可以通过点转置操作符(.’)实现。

(3)共轭和非共轭转置也可以通过 MATLAB 函数完成,transpose 实现非共轭转置,功能等同于点转置操作符(.’):ctranspose实现共轭转置,功能等同于转置操作符(’)。当然,这4种方法对于实数数组转置结果是一样的。

【例2-15】数组转置。

解:在Commond Window窗口输入以下命令。

>> A=rand(2,4)

A =

0.9575 0.1576 0.9572 0.8003

0.9649 0.9706 0.4854 0.1419

>> A'

ans =

0.9575 0.9649

0.1576 0.9706

0.9572 0.4854

0.8003 0.1419

>> B=[2-i,3+4i,2,5i;6+i,4-i,2i,7]

B =

2.0000 -1.0000i 3.0000+ 4.0000i 2.0000   0+ 5.0000i

6.0000+ 1.0000i 4.0000 -1.0000i 0+ 2.0000i  7.0000

>> B'

ans =

2.0000+ 1.0000i 6.0000 -1.0000i

3.0000 -4.0000i 4.0000+ 1.0000i

2.0000    0 -2.0000i

0 - 5.0000i 7.0000

>> B.'

ans =

2.0000 -1.0000i 6.0000+ 1.0000i

3.0000+ 4.0000i 4.0000 -1.0000i

2.0000     0+ 2.0000i

0+ 5.0000i 7.0000

>> transpose(B)

ans =

2.0000 -1.0000i 6.0000+ 1.0000i

3.0000+ 4.0000i 4.0000 -1.0000i

2.0000     0+ 2.0000i

0+ 5.0000i 7.0000

实际使用中,由于操作符的简便性,经常会使用操作符而不是转置函数来实现转置。但是在复杂的嵌套运算中,转置函数可能是唯一的可用方法。所以,两类转置方式读者都要掌握。

2.数组翻转

MATLAB中数组翻转的函数见表2-7。

【例2-16】数组翻转。

解:在Commond Window窗口输入以下命令。

>> A=rand(4,6)

A =

0.4218 0.6557 0.6787 0.6555 0.2769 0.6948

0.9157 0.0357 0.7577 0.1712 0.0462 0.3171

0.7922 0.8491 0.7431 0.7060 0.0971 0.9502

0.9595 0.9340 0.3922 0.0318 0.8235 0.0344

>> flipud(A)

ans =

0.9595 0.9340 0.3922 0.0318 0.8235 0.0344

0.7922 0.8491 0.7431 0.7060 0.0971 0.9502

0.9157 0.0357 0.7577 0.1712 0.0462 0.3171

0.4218 0.6557 0.6787 0.6555 0.2769 0.6948

>> fliplr(A)

ans =

0.6948 0.2769 0.6555 0.6787 0.6557 0.4218

0.3171 0.0462 0.1712 0.7577 0.0357 0.9157

0.9502 0.0971 0.7060 0.7431 0.8491 0.7922

0.0344 0.8235 0.0318 0.3922 0.9340 0.9595

>> flipdim(A,2)

ans =

0.6948 0.2769 0.6555 0.6787 0.6557 0.4218

0.3171 0.0462 0.1712 0.7577 0.0357 0.9157

0.9502 0.0971 0.7060 0.7431 0.8491 0.7922

0.0344 0.8235 0.0318 0.3922 0.9340 0.9595

>> rot90(A,2)

ans =

0.0344 0.8235 0.0318 0.3922 0.9340 0.9595

0.9502 0.0971 0.7060 0.7431 0.8491 0.7922

0.3171 0.0462 0.1712 0.7577 0.0357 0.9157

0.6948 0.2769 0.6555 0.6787 0.6557 0.4218

>> rot90(A)

ans =

0.6948 0.3171 0.9502 0.0344

0.2769 0.0462 0.0971 0.8235

0.6555 0.1712 0.7060 0.0318

0.6787 0.7577 0.7431 0.3922

0.6557 0.0357 0.8491 0.9340

0.4218 0.9157 0.7922 0.9595

3.数组尺寸调整

改变数组形状,还有一个常用的函数 reshape,它可以把已知数组改变成指定的行列尺寸。

对于m行n列的数组A,B=reshape(A,a,b)可以将其调整为a行b列的尺寸,并赋值为变量B,这里必须满足m·n=a·b。在尺寸调整前后,两个数组的单下标索引不变,即A(x)必然等于B(x),只要x是符合取值范围要求的单下标数字。也就是说,按照列优先原则把A和B的元素排列成一列,那结果必然是一样的。

【例2-17】数组尺寸调整。

解:在Commond Window窗口输入以下命令。

>> A=rand(3,4)

A =

0.4387 0.7952 0.4456 0.7547

0.3816 0.1869 0.6463 0.2760

0.7655 0.4898 0.7094 0.6797

>> reshape(A,2,6)

ans =

0.4387 0.7655 0.1869 0.4456 0.7094 0.2760

0.3816 0.7952 0.4898 0.6463 0.7547 0.6797

>> reshape(A,2,8)    %a*b不等于m*n时会报错

Error using reshape

To RESHAPE the number of elements must not change.

2.2.5 数组运算

本节介绍数组的各种数学运算。

1.数组—数组运算

最基本的就是数组和数组的加(+)、减(−)、乘(*)、乘方(^)等运算。要注意,数组的加、减,要求参与运算的两个数组具有相同的尺寸,而数组的乘法要求第一个数组的列数等于第二个数组的行数。

乘方运算在指数n为自然数时相当于n次自乘,这要求数组具有相同的行数和列数。关于指数为其他情况的乘方,本节不作讨论,读者可以参考有关高等代数书籍。

【例2-18】使用数组—数组运算。

解:在Commond Window窗口输入以下命令。

>> A=magic(4)

A =

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

>> B=eye(4)

B =

1 0 0 0

0 1 0 0

0 0 1 0

0 0 0 1

>> A+B

ans =

17 2 3 13

5 12 10 8

9 7 7 12

4 14 15 2

数组除法实际上是乘法的逆运算,相当于参与运算的一个数组和另一个数组的逆(或伪逆)数组相乘。MATLAB中数组除法有左除(/)和右除(\)两种。

·A/B 相当于A·inv(B)或A·pinv(B)。

·A\B 相当于inv(A)·B或pinv(A)·B。

其中inv是数组求逆函数,仅适用于行列数相同的方形数组(线性代数中,称为方阵);pinv 是求数组广义逆的函数。关于逆矩阵和广义逆矩阵的知识,请读者参考有关高等代数书籍。

【例2-19】使用数组除法。

解:在Commond Window窗口输入以下命令。

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

A =

3 5 6

2 1 4

2 5 6

>> B=randn(3)

B =

0.5377 0.8622 -0.4336

1.8339 0.3188 0.3426

-2.2588 -1.3077 3.5784

>> A/B

ans =

8.8511 2.1711 2.5413

2.2919 1.9120 1.2125

9.1861 1.6402 2.6328

>> A*inv(B)

ans =

8.8511 2.1711 2.5413

2.2919 1.9120 1.2125

9.1861 1.6402 2.6328

>> pinv(A)*B

ans =

2.7965 2.1699 -4.0120

-0.6323 0.1097 -0.2707

-0.7817 -1.0327 2.1593

2.点运算

前面讲到的数组乘、除、乘方运算,都是专门针对数组定义的运算。在有些情况下,用户可能希望对两个尺寸相同的数组进行元素对元素的乘、除,或者对数组的逐个元素进行乘方,这就可以通过点运算实现。

A.*B,就可以实现两个同样尺寸的数组A和数组B对于元素的乘法,同样地,A./B或A.\B实现元素对元素的除法,A.^n实现对逐个元素的乘方。

【例2-20】使用点运算。

解:在Commond Window窗口输入以下命令。

>> A=magic(4)

A =

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

>> B=ones(4)+4*eye(4)

B =

5 1 1 1

1 5 1 1

1 1 5 1

1 1 1 5

>> A.*B

ans =

80 2 3 13

5 55 10 8

9 7 30 12

4 14 15 5

>>B.*A  %对应的元素的乘法,因此和A.*B结果一样

ans =

80 2 3 13

5 55 10 8

9 7 30 12

4 14 15 5

>>A.\B  %以A的各个元素为分母,B相对应的各个元素为分子,逐个元素作除法

ans =

0.3125 0.5000 0.3333 0.0769

0.2000 0.4545 0.1000 0.1250

0.1111 0.1429 0.8333 0.0833

0.2500 0.0714 0.0667 5.0000

特别要强调的是,许多MATLAB内置的运算函数,如sqrt,exp,log,sin等,都只能对数组进行逐个元素的相应运算。至于专门的数组的开方、指数等运算,都有专门的数组运算函数。

3.专门针对数组的运算函数

MATLAB中,专门针对数组的运算函数一般末尾都以m结尾(m代表matirx),如sqrtm和 expm 等,这些运算都是特别定义的数组运算,不同于针对单个数值的常规数学运算。这几个函数都要求参与运算的数组是行数和列数相等的方形数组。具体的运算方式请参考高等代数方面的书籍。

【例2-21】使用数组运算函数。

解:在Commond Window窗口输入以下命令。

>> A=magic(4)

A =

16 2 3 13

5 11 10 8

9 7 6 12

4 14 15 1

>> sqrt(A)

ans =

4.0000 1.4142 1.7321 3.6056

2.2361 3.3166 3.1623 2.8284

3.0000 2.6458 2.4495 3.4641

2.0000 3.7417 3.8730 1.0000

>> sqrtm(A)

ans =

3.7584 -0.2071i -0.2271+ 0.4886i 0.3887+ 0.7700i 1.9110 -1.0514i

0.2745 -0.0130i 2.3243+ 0.0306i 2.0076+ 0.0483i 1.2246 -0.0659i

1.3918 -0.2331i 1.5060+ 0.5498i 1.4884+ 0.8666i 1.4447 -1.1833i

0.4063+ 0.4533i 2.2277 -1.0691i 1.9463 - 1.6848i 1.2506+ 2.3006i

>> exp(A)

ans =

1.0e+06 *

8.8861 0.0000 0.0000 0.4424

0.0001 0.0599 0.0220 0.0030

0.0081 0.0011 0.0004 0.1628

0.0001 1.2026 3.2690 0.0000

2.2.6 数组的查找

MATLAB中数组查找只有一个函数find。它能够查找数组中的非零元素并返回其下标索引。find 配合各种关系运算和逻辑运算,能够实现很多查找功能。find 函数有两种语法形式。

a=find(A)返回数组A中非零元素的单下标索引。

[a,b]=find(A)返回数组A中非零元素的双下标索引方式。

实际应用中,经常通过多重逻辑嵌套产生逻辑数组,判断数组元素是否符合某种比较关系,然后用find函数查找这个逻辑数组中的非零元素,返回符合比较关系的元素的索引,从而实现元素访问。find 用于产生索引数组,过度实现最终的索引访问,因此经常不需要直接指定find函数的返回值。

【例2-22】使用数组查找函数find。

解:在Commond Window窗口输入以下命令。

>> A=rand(3,5)

A =

0.6787 0.3922 0.7060 0.0462 0.6948

0.7577 0.6555 0.0318 0.0971 0.3171

0.7431 0.1712 0.2769 0.8235 0.9502

>> A<0.5

ans =

0 1 0 1 0

0 0 1 1 1

0 1 1 0 0

>> A>0.3

ans =

1 1 1 0 1

1 1 0 0 1

1 0 0 1 1

>> (A>0.3)&(A<0.5)  %逻辑嵌套产生符合多个比较关系的逻辑数组

ans =

0 1 0 0 0

0 0 0 0 1

0 0 0 0 0

>> find((A>0.3)&(A<0.5))  %逻辑数组中的非零元素,返回符合关系的元素索引

ans =

4

14

>>A(find((A>0.3)&(A<0.5))) %实现元素访问

ans =

0.3922

0.3171

例2-22分步展示了find最常见用法的具体使用过程。

首先通过rand函数创建了待操作的随机数组A,然后通过比较运算A>0.3和A<0.5返回分别满足某一比较关系的逻辑数组。在这些逻辑数组中,1 代表该位置元素复合比较关系,0则代表不符合比较关系。

然后通过逻辑运算(&)可以产生同时满足两个比较关系的逻辑数组,find 操作这个逻辑数组,返回数组中非零元素的下标索引(本例中返回单下标索引),实际上就是返回原数组中符合两个比较关系的元素的位置索引,然后利用find返回的下标索引就可以寻址访问原来数组中符合比较关系的目标元素。

2.2.7 数组的排序

数组排序也是常用的数组操作,经常用在各种数据分析和处理中,MATLAB中的排序函数是sort。

sort 函数可以对数组按照升序或降序进行排列,并返回排序后的元素在原始数组中的索引位置,sort函数有多种应用语法格式,都有重要的应用,见表2-8。

可以看到,sort 都是对单独的一行或一列元素进行排序。即使对于二维数组,也是单独对每一行每一列进行排序,因此返回的索引只是单下标形式,表征排序后的元素在原来行或列中的位置。

【例2-23】数组排序。

解:在Commond Window窗口输入以下命令。

>> A=rand(1,8)

A =

0.0344 0.4387 0.3816 0.7655 0.7952 0.1869 0.4898 0.4456

>> sort(A)   %按照默认的升序方式排列

ans =

0.0344 0.1869 0.3816 0.4387 0.4456 0.4898 0.7655 0.7952

>> [B,J]=sort(A,'descend') %降序排列并返回索引

B =

J =

0.7952 0.7655 0.4898 0.4456 0.4387 0.3816 0.1869 0.0344

5 4 7 8 2 3 6 1

>>A(J)   %通过索引页可以产生降序排列的数组

ans =

0.7952 0.7655 0.4898 0.4456 0.4387 0.3816 0.1869 0.0344

通过例2-23可见,数组排序函数sort返回的索引,是表示了在排序方向上排序后元素在原数组中的位置。对于一维数组,这就是其单下标索引,但对二维数组,这只是双下标索引中的一个分量,因此不能简单地通过这个返回的索引值寻址产生排序的二维数组。

当然,利用这个索引结果,通过复杂一点的方法也可以得到排序数组,如例2-23中,就可以通过A(J)来产生排序数组,这种索引访问,一般只用在对部分数据的处理上。

2.2.8 高维数组的降维操作

【例2-24】使用squeeze命令来撤销“孤维”,使高维数组进行降维。

解:在Commond Window窗口输入以下命令。

>> A=rand(2,3,3)

A(:,:,1) =

0.1320 0.9561 0.0598

0.9421 0.5752 0.2348

A(:,:,2) =

0.3532 0.0154 0.1690

0.8212 0.0430 0.6491

A(:,:,3) =

0.7317 0.4509 0.2963

0.6477 0.5470 0.7447

>>B=cat(4,A(:,:,1),A(:,:,2),A(:,:,3))

B(:,:,1,1) =

0.1320 0.9561 0.0598

0.9421 0.5752 0.2348

B(:,:,1,2) =

0.3532 0.0154 0.1690

0.8212 0.0430 0.6491

B(:,:,1,3) =

0.7317 0.4509 0.2963

0.6477 0.5470 0.7447

>> C=squeeze(B)

C(:,:,1) =

0.1320 0.9561 0.0598

0.9421 0.5752 0.2348

C(:,:,2) =

0.3532 0.0154 0.1690

0.8212 0.0430 0.6491

C(:,:,3) =

0.7317 0.4509 0.2963

0.6477 0.5470 0.7447

>> size_B=size(B)

size_B =

2 3 1 3

>> size_C=size(C)

size_C =

2 3 3

2.3 曲线拟合

在科学和工程领域,曲线拟合的主要功能是寻求平滑的曲线来最好地表现带有噪声的测量数据,从这些测量数据中寻求两个函数变量之间的关系或者变化趋势,最后得到曲线拟合的函数表达式y=f(x)。

一般来说,使用多项式进行数据拟合会出现数据振荡,而Spline插值的方法可以得到很好的平滑效果,但是关于该插值方法有太多的参数,不适合曲线拟合的方法。

同时,由于在进行曲线拟合的时候,已经认为所有测量数据中已经包含噪声,因此,最后的拟合曲线并不要求通过每一个已知数据点,衡量拟合数据的标准则是整体数据拟合的误差最小。

一般情况下,MATLAB的曲线拟合方法用的是“最小方差”函数,其中方差的数值是拟合曲线和已知数据之间的垂直距离。

2.3.1 多项式拟合

在MATLAB中,函数polyfit()采用最小二乘法对给定的数据进行多项式拟合,得到该多项式的系数。该函数的调用方式如下。

polyfit(x,y,n)

找到次数为n 的多项式系数,对于数据集合{(xi, yi)},满足差的平方和最小。

[p,E]=polyfit(x,y,n)

返回同上的多项式P和矩阵E。多项式系数在向量p中,矩阵E用在polyval函数中来计算误差。

【例2-25】某数据的横坐标为x=[0.2 0.3 0.5 0.6 0.8 0.9 1.2 1.3 1.5 1.8],纵坐标为y=[1 2 3 5 6 7 6 5 4 1],对该数据进行多项式拟合。

解:代码如下。

x=[0.3 0.4 0.7 0.9 1.2 1.9 2.8 3.2 3.7 4.5];

y=[1 2 3 4 5 2 6 9 2 7];

p5=polyfit(x,y,5);   %5阶多项式拟合

y5=polyval(p5,x);

p5=vpa(poly2sym(p5),5)  %显示5阶多项式

p9=polyfit(x,y,9);   %9阶多项式拟合

y9=polyval(p9,x);

figure;    %画图显示

plot(x,y,'bo');

hold on;

plot(x,y5,'r:');

plot(x,y9,'g--');

legend('原始数据','5阶多项式拟合','9阶多项式拟合');

xlabel('x');

ylabel('y');

运行程序后,得到的5阶多项式如下。

p5 =

0.8877*x^5 - 10.3*x^4 + 42.942*x^3 - 77.932*x^2 + 59.833*x - 11.673

运行程序后,得到的输出结果如图2-6所示。由图可以看出,使用5次多项式拟合时,得到的结果比较差。

当采用9次多项式拟合时,得到的结果与原始数据符合的比较好。当使用函数polyfit()进行拟合时,多项式的阶次最大不超过length(x)−1。

2.3.2 加权最小方差(WLS)拟合原理及实例

所谓加权最小方差,就是根据基础数据本身各自的准确度的不同,在拟合的时候给每个数据以不同的加权数值。这种方法比前面所介绍的单纯最小方差方法要更加符合拟合的初衷。

对应N阶多项式的拟合公式,所需要求解的拟合系数需要求解线性方程组,其中线性方程组的系数矩阵和需要求解的拟合系数矩阵如下。

使用加权最小方差方法求解得到拟合系数

其对应的加权最小方差为表达式

【例2-26】根据WLS数据拟合方法,自行编写使用WLS方法拟合数据的M函数,然后使用WLS方法进行数据拟合。

解:在M文件编辑器中输入下面的程序代码。

function [th,err,yi]=polyfits(x,y,N,xi,r)

%x,y为数据点系列,N为多项式拟合的系统,r为加权系数的逆矩阵。

M=length(x);

x=x(:);

y=y(:);

%判断调用函数的格式

if nargin==4

%当调用函数的格式为(x,y,N,r)

if length(xi)==M

r=xi;

xi=x;

%当调用函数的格式为(x,y,N,xi)

else

r=1;

end

%当调用格式为(x,y,N)

else if nargin==3

xi=x;

r=1;

end

%求解系数矩阵

A(:,N+1)=ones(M,1);

for n=N:-1:1

A(:,n)=A(:,n+1).*x;

end

if length(r)==M

for m=1:M

A(m,:)=A(m,:)/r(m);

y(m)=y(m)/r(m);

end

end

%计算拟合系数

th=(A\y)';

ye=polyval(th,x);

err=norm(y-ye)/norm(y);

yi=polyval(th,xi);

将上面代码保存为“polyfits.m”文件。

使用上面的程序代码,对基础数据进行LS多项式拟合。在MATLAB的命令窗口中输入下面的程序代码。

x=[-3:1:3]';

y=[1.1650 0.0751 -0.6965 0.0591 0.6268 0.3516 1.6961]';

[x,i]=sort(x);

y=y(i);

xi=min(x)+[0:100]/100*(max(x)-min(x));

for i=1:4

N=2*i-1;

[th,err,yi]=polyfits(x,y,N,xi);

subplot(2,2,i)

plot(x,y,'o')

hold on

plot(xi,yi,'-')

grid on

end

得到的拟合结果如图2-7所示。

从上面的例子可以看出,LS方法其实是WLS方法的一种特例,相当于将每个基础数据的准确度都设为1,但是,自行编写的M文件和默认的命令结果不同,请仔细比较。

2.4 M文件

M 文件有两种形式:脚本文件(Script File)和函数文件(Function File)。脚本文件通常用于执行一系列简单的MATLAB命令,运行时只需输入文件名字,MATLAB就会自动按顺序执行文件中的命令。

函数文件和脚本文件不同,它可以接受参数,也可以返回参数,在一般情况下,用户不能靠单独输入其文件名来运行函数文件,而必须由其他语句来调用,MATLAB的大多数应用程序都以函数文件的形式给出。

2.4.1 M文件概述

MATLAB提供了极其丰富的内部函数,使得用户可以通过命令行调用就可以完成很多工作,但是想要更加高效地利用MATLAB,离不开MATLAB编程。

用户可以通过组织一个MATLAB命令序列完成一个独立的功能,这就是脚本M文件编程;而把M文件抽象封装,形成可以重复利用的功能块,这就是函数M文件编程。因此,MATLAB编程是提高MATLAB应用效率,把MATLAB基本函数扩展为实际的用户应用的必经之道。

M文件是包含MATLAB代码的文件。M文件按其内容和功能可以分为脚本M文件和函数M文件这两大类。

1.脚本M文件

它是许多 MATLAB 代码按顺序组成的命令序列集合,不接受参数的输入和输出,与MATLAB 工作区共享变量空间。脚本 M 文件一般用来实现一个想对独立的功能,比如对某个数据集进行某种分析、绘图,求解某个已知条件下的微分方程等。用户可以通过在命令窗口直接键入文件名来运行脚本M文件。

通过脚本M文件,用户可以把为实现一个具体功能的一系列MATLAB代码书写在一个M文件中,每次只需要键入文件名即可运行脚本M文件中的所有代码。

2.函数M文件

它也是为了实现一个单独功能的代码块,但它与脚本M文件不同的是需要接受参数输入和输出,函数M文件中的代码一般只处理输入参数传递的数据,并把处理结果作为函数输出参数返回给MATLAB工作区中指定的接受量。

因此,函数M文件具有独立的内部变量空间,在执行函数M文件时,需指定输入参数的实际取值,而且一般要指定接收输出结果的工作区变量。

MATLAB 提供的许多函数就是用函数 M 文件编写的。尤其是各种工具箱中的函数,用户可以打开这些M文件查看。实际上,对应特殊应用领域的用户,如果积累了充足的专业领域应用的函数,就可以组建自己的专业领域工具箱。

通过函数M文件,用户可以把为实现一个抽象功能的MATLAB代码封装成一个函数接口,在以后的应用中重复调用。

MATLAB中的M文件一般包括以下5部分结构。

(1)函数声明行。

这一行只出现在M文件的第一行,通过function关键字表明此文件是一个M文件,并指定函数名、输入和输出参数。

(2)H1行。

这是帮助文字的第一行,给出M文件帮助最关键的信息。当用lookfor查找某个单词相关的函数时,lookfor只在H1行中搜索是否出现指定单词。

(3)帮助文字。

这部分对M文件更加详细的说明,解释M文件实现的功能,M文件中出现的各变量、参数的意义,以及操作版权详细信息等。

(4)M文件正文。

这是M文件实现功能的MATLAB代码部分,通常包括运算、赋值等指令。

(5)注释部分。

这部分出现的位置比较灵活,主要是用来注释M文件正文的具体运行过程,方便阅读和修改,经常穿插在M文件正文中间。

2.4.2 局部变量与全局变量

无论在脚本文件还是在函数文件中,都会定义一些变量。函数文件所定义的变量是局部变量,这些变量独立于其他函数的局部变量和工作空间的变量,即只能在该函数的工作空间引用,而不能在其他函数工作空间和命令工作空间引用。但是如果某些变量被定义成全局变量,就可以在整个 MATLAB 工作空间进行存取和修改,以实现共享。因此,定义全局变量是函数间传递信息的一种手段。

用命令global定义全局变量,其格式如下。

global A B C

将A、B、C这3个变量定义为全局变量。

在M文件中定义全局变量时,如果在当前工作空间已经存在相同的变量,系统将会给出警告,说明由于将该变量定义为全局变量,可能会使变量的值发生改变。为避免发生这种情况,应该在使用变量前先将其定义为全局变量。

提示:在 MATLAB 中对变量名是区分大小写的,因此为了在程序中分清楚而不至于误声明,习惯上可以将全局变量定义为大写字母。

【例2-27】全局变量的使用。

解:在Commond Window窗口输入以下命令。

function y=myt(x)

global a;

a=a+9;

y=cos(x);

然后在命令窗口声明全局变量赋值调用。

>> global a

>> a=2

a =

2

>> myt(pi)

ans =

-1

>> cos(pi)

ans =

-1

>> a

a =

11

通过例2-27可见,用global将a声明为全局变量后,函数内部对a的修改也会直接作用到MATLAB工作区中,函数调用一次后,a的值从2变为11。

2.4.3 M文件的编辑与运行

MATLAB 语言是一种高效的编程语言,可以用普通的文本编辑器把一系列 MATLAB语句写在一起构成MATLAB程序,然后存储在一个文件里,文件的扩展名为.m,因此称为M文件。这些文件都是由纯ASCII码字符构成的,在运行M文件时只需在MATLAB命令窗口下输入该文件名即可。

在MATLAB的编辑器中建立与编辑M文件的一般步骤如下。

1.新建文件

(1)最简单的方法是单击MATLAB主界面工具栏上的图标。

(2)在Commond Window窗口输入edit 语句建立新文件,或输入edit filename 语句,打开名为filename的M文件,在弹出文件不存在的提示框中,单击“Yes”按钮,则建立名为filename 新的M 文件。

(3)选择MATLAB主界面的Home→New子菜单,在其下拉菜单中选择“Script”项。

(4)如果已经打开了文件编辑器后需要再建立新文件,可以用编辑器的菜单或工具栏上相应的图标进行操作。

提示:还可以使用“Ctrl+N”的快捷方式打开一个新的M文件。

2.打开文件

(1)单击MATLAB主界面工具栏上的图标,弹出Open窗口,选择已有的M文件,单击“打开”按钮,如图2-8所示。

(2)输入edit filename 语句,打开名为filename 的M 文件。

3.编辑文件

虽然M文件是普通的文本文件,在任何的文本编辑器中都可以编辑,但MATLAB系统提供了一个更方便的内部编辑器(Editor),如图2-9所示。

对于新建的M文件,可以在MATLAB的Editor窗口编写新的文件;对于打开的已有M文件,其内容显示在Editor窗口,用户可以对其进行修改。

在编辑的过程中可以使用类似于其他文本编辑器(如Word)的“复制”(Copy)菜单、工具栏的编辑图标和快捷键等,值得注意的是,除了注释内容外,所有MATLAB的语句都要使用西文字符。

4.保存文件

M文件在运行之前必须先保存。其方法如下。

·单击编辑器工具栏上的图标:对于新建的M文件,则弹出“保存文件”(Save file as)对话框,选择存放的路径、文件名和文件保存类型(不选择时为M 文件),单击“保存”按钮,即可完成保存;对于打开的已有M文件,则直接完成保存。

·使用“Ctrl+S”的快捷方式。等同于单击编辑器工具栏上的图标。

·选择工具栏Save 下拉菜单中的“Save As…”选项,可以在弹出“保存文件”(Select file for Save as)对话框中,重新选择存放的目录、文件名进行保存。

5.运行文件

脚本文件可直接运行,而函数文件还必须输入函数参数。

(1)在命令窗口输入要运行的文件名即可开始运行,需要注意的是,在运行前,一定要先保存文件,否则运行的是保存前的程序。

(2)如果在编辑器中完成编辑后需要直接运行,可以直接用鼠标单击图标。

(3)按F5键则保存程序并直接运行;如果是新建M文件,则弹出“保存文件”对话框,用户保存文件后直接运行。

2.4.4 脚本文件

脚本文件是M文件中最简单的一种,不需要输入顿号输出参数,用命令语句可以控制MATLAB命令工作空间的所有数据。

在运行过程中,产生的所有变量均是命令工作空间变量,这些变量一旦生成,就一直保存在内存空间中,除非用户执行clear命令将它们清除。运行一个脚本文件等价于从命令窗口中顺序运行文件里的语句。由于脚本文件只是一串命令的集合,因此只需像在命令窗口中输入语句那样,依次将语句编辑在脚本文件中即可。

【例2-28】编程计算向量元素的平均值。

解:在MATLAB编辑窗口输入以下命令。

a=input('输入变量:a=');

[b,c]=size(a);

if~((b==1)|(c==1))|(((b==1)&(c==1))) %判断输入是否为向量

error('必须输入向量')

end

average=sum(a)/length(a)   %计算向量 a所有元素的平均值

将其保存为pingjun.m,运行之,如果输入行向量[1 2 3],则运行结果如下。

>> pingjun

输入变量:a=[1 2 3]。

average =

2

如果输入的不是向量,如[1 2; 3 4],则运行结果如下。

>> pingjun

输入变量:a=[1 2; 3 4],则运行结果如下。

Error using pingjun (line 4)

这是因为必须输入向量。

2.4.5 函数文件

如果M文件的第一个可执行语句以function开始,该文件就是函数文件,每一个函数文件都定义一个函数。事实上,MATLAB 提供的函数命令大部分都是由函数文件定义的,这足以说明函数文件的重要。

从使用的角度看,函数是一个“黑箱”,把一些数据送进去,经加工处理,把结果送出来。从形式上看,函数文件区别于脚本文件之处在于脚本文件的变量为命令工作空间变量,在文件执行完成后保留在命令工作空间中;而函数文件内定义的变量为局部变量,只在函数文件内部起作用,当函数文件执行完后,这些内部变量将被清除。

【例2-29】编写函数 average( )用于计算向量元素的平均值。

解:在MATLAB编辑窗口输入以下命令。

function y=average(x)

[a,b]=size(x);    %判断输入量的大小

if~((a==1)|(b==1))| ((a==1)& (b==1)) %判断输入是否为向量

error('必须输入向量。')

end

y=sum(x)/length(x);   %计算向量x所有元素的平均值

将文件存盘,默认状态下函数名为 average_2.m(文件名与函数名相同),函数 average接受一个输入参数并返回一个输出参数,该函数的用法与其他 MATLAB 函数一样;在MATLAB 命令窗口中运行以下语句,便可求得1~9 的平均值。

>> x=1:9

x =

1 2 3 4 5 6 7 8 9

>> average(x)

ans =

5

通常函数文件由以下几个基本部分组成。

(1)函数定义行。函数定义行由关键字 function 引导,指明这是一个函数文件,并定义函数名、输入参数和输出参数,函数定义行必须为文件的第一个可执行语句,函数名与文件名相同,可以是MATLAB 中任何合法的字符。

函数文件可以带有多个输入和输出参数,如下。

function [x,y,z]=sphere(theta,phi,rho)

也可以没有输出参数,如下。

function printresults(x)

(2)H1行。H1行就是帮助文本的第一行,是函数定义行下的第一个注释行,是供lookfor查询时使用的。一般来说为了充分利用MATLAB的搜索功能,在编制M文件时,应在H1行中尽可能多地包含该函数的特征信息。由于在搜索路径上包含 average 的函数很多,因此用lookfor average 语句可能会查询到多个有关的命令。如下。

>> lookfor average_2

average_2.m:% 函数average_2(x)用以计算向量元素的平均值。

(3)帮助文本。在函数定义行后面,连续的注释行不仅可以起到解释与提示作用,更重要的是为用户自己的函数文件建立在线查询信息,以供help命令在线查询时使用。如下。

>> help average_2

函数 average_2(x)用以计算向量元素的平均值。

输入参数x为输入向量,输出参数y为计算的平均值。非向量输入将导致错误。

(4)函数体。函数体包含了全部的用于完成计算及给输出参数赋值等工作的语句,这些语句可以是调用函数、流程控制、交互式输入/输出、计算、赋值、注释和空行。

(5)注释。以%起始到行尾结束的部分为注释部分,MATLAB的注释可以放置在程序的任何位置,可以单独占一行,也可以在一个语句之后,如

%非向量输入将导致错误

[m,n]=size(x);%判断输入量的大小

2.4.6 函数调用

调用函数文件的一般格式如下。

[输出参数表]=函数名(输入参数表)

调用函数时应注意以下几项。

(1)当调用一个函数时,输入和输出参数的顺序应与函数定义时一致,其数目可以按少于函数文件中所规定的输入和输出参数调用函数,但不能使用多于函数文件所规定的输入和输出参数数目。如果输入和输出参数数目多于或少于函数文件所允许的数目,则调用时自动返回错误信息。举例如下。

>> [x,y]=sin(pi)

??? Error using ==> sin

Too many output arguments.

又如:

>> y=linspace(2)

??? Input argument "n" is undefined.

Error in ==> linspace at 21

(2)在编写函数文件调用时常通过nargin、nargout 函数来设置默认输入参数,并决定用户所希望的输出参数。函数nargin 可以检测函数被调用时用户指定的输入参数个数;函数nargout 可以检测函数被调用时用户指定的输出参数个数。

在函数文件中通过nargin、nargout 函数,可以适应函数被调用时,用户输入和输出参数数目少于函数文件中 function 语句所规定数目的情况,以决定采用何种默认输入参数和用户所希望的输出参数。举例如下。

function y = linspace(d1, d2, n)

%LINSPACE Linearly spaced vector.

% LINSPACE(X1, X2) generates a row vector of 100 linearly

% equally spaced points between X1 and X2.

%

% LINSPACE(X1, X2, N) generates N points between X1 and X2.

% For N < 2, LINSPACE returns X2.

%

% Class support for inputs X1,X2:

% float: double, single

%

% See also LOGSPACE, :.

% Copyright 1984-2004 The MathWorks, Inc.

%$Revision: 5.12.4.1 $$Date: 2004/07/05 17:01:20 $

if nargin == 2

n = 100;

end

n = double(n);

y = [d1+(0:n-2)*(d2-d1)/(floor(n)-1) d2];

如果用户只指定2 个输入参数调用linspace,例如linspace(0,10),linspace 在0~10 之间等间隔产生 100 个数据点;相反,如果输入参数的个数是 3,例如,linspace(0,10,50),第3 个参数决定数据点的个数,linspace 在0~10 等间隔产生50 个数据点。同样,函数也可按少于函数文件中所规定的输出参数进行调用。例如对函数size( )的调用。

>> x=[1 2 3 ; 4 5 6];

>> m=size(x)

m =

2 3

>> [m,n]=size(x)

m =

2

n =

3

(3)当函数有一个以上输出参数时,输出参数包含在方括号内。例如,[m,n]=size(x)。注意:[m,n]在左边表示函数的两个输出参数m和n;不要把它和[m,n]在等号右边的情况混淆,如y=[m,n]表示数组y由变量m和n所组成。

(4)当函数有一个或多个输出参数,但调用时未指定输出参数,则不给输出变量赋任何值。举例如下。

function t=toc

% TOC Read the stopwatch timer.

% TOC, by itself, prints the elapsed time (in seconds) since TIC was used.

% t = TOC; saves the elapsed time in t, instead of printing it out.

% See also TIC, ETIME, CLOCK, CPUTIME.

% Copyright(c)1984-94byTheMathWorks,Inc.

% TOC uses ETIME and the value of CLOCK saved by TIC.

Global TICTOC

If nargout<1

elapsed_time=etime(clock,TICTOC)

else

t=etime(clock,TICTOC);

end

如果用户调用toc 时不指定输出参数t,举例如下。

>> tic

>> toc

elapsed_time =

4.0160

函数在命令窗口显示函数工作空间变量 elapsed_time 的值,但在 MATLAB 命令工作空间里不给输出参数t赋任何值,也不创建变量t。

如果用户调用toc时指定输出参数t,举例如下。

>> tic

>> out=toc

out =

2.8140

则以变量out 的形式返回到命令窗口,并在MATLAB 命令工作空间里创建变量out。

(5)函数有自己的独立工作空间,它与MATLAB的工作空间分开。除非使用全局变量,函数内变量与MATLAB其他工作空间之间唯一的联系是函数的输入和输出参数。如果函数任一输入参数值发生变化,其变化仅在函数内出现,不影响 MATLAB 其他工作空间的变量。函数内所创建的变量只驻留在该函数工作空间,而且只在函数执行期间临时存在,以后就消失。因此,从一个调用到另一个调用,在函数工作空间以变量存储信息是不可能的。

(6)在MATLAB其他工作空间重新定义预定义的变量(例如pi),它不会延伸到函数的工作空间;反之亦然,即在函数内重新定义预定义的变量不会延伸到MATLAB的其他工作空间中。

(7)如果变量说明是全局的,函数可以与其他函数、MATLAB的Workspace和递归调用本身共享变量。为了在函数内或MATLAB命令工作空间中访问全局变量,全局变量在每一个所希望的工作空间都必须说明。

(8)全局变量可以为编程带来某些方便,但却破坏了函数对变量的封装,所以在实际编程中,无论什么时候都应尽量避免使用全局变量。如果一定要用全局变量,建议全局变量名要长、采用大写字母,并有选择地以首次出现的M文件的名字开头,使全局变量之间不必要的互作用减至最小。

(9)MATLAB 以搜寻脚本文件的同样方式搜寻函数文件。例如,输入 cow 语句, MATLAB首先认为cow是一个变量;如果它不是,那么MATLAB认为它是一个内置函数;如果还不是,MATLAB 检查当前cow.m 的目录或文件夹;如果仍然不是,MATLAB 就检查cow.m在MATLAB搜寻路径上的所有目录或文件夹。

(10)从函数文件内可以调用脚本文件。在这种情况下,脚本文件查看函数工作空间,不查看MATLAB的Workspace。从函数文件内调用的脚本文件不必调到内存进行编译,函数每调用一次,它们就被打开和解释。因此,从函数文件内调用脚本文件减慢了函数的执行。

(11)当函数文件到达文件终点,或者碰到返回命令return,就结束执行和返回。返回命令return提供了一种结束函数的简单方法,而不必到达文件的终点。

2.4.7 M文件调试工具

当完成MATLAB代码编写后,用户就可以在命令窗口运行代码(脚本或函数文件)。对于比较简单的代码,一般只要编程习惯较好,都可以一次通过,但对于很多比较复杂的情况,或者用户初学MATLAB编程,一些常见的错误还不能避免,容易在运行时出现错误,这时候,就需要利用MATLAB的调试工具对出现错误的代码进行调试纠错。

MATLAB 的Editor 窗口是一个综合了代码编写、调试的集成开发环境。MATLAB代码调试过程,主要是通过Editor窗口上的工具栏完成,如图2-10所示。

下面介绍Editor窗口上几种经常用到的工具。

(1)Compare:比较两个M文件的差异,并出具报告,报告格式如图2-11所示。

(2)Insert:在M文件中插入注释、函数或者数据等。

(3)Comment:屏蔽或者取消屏蔽M文件中的内容。

(4)Indent:调整M文件内容的位置。

(5)Run:运行当前M文件,快捷键是F5;当前M文件设置了断点时,运行到断点处暂停。

(6)Run Section:运行当前M 文件中用户选中的某一部分程序。

(7)Breakpoints:设置或清除断点。其下拉菜单中的命令如图2-12所示。

当选择该选项下拉菜单中的Set Condition 时,会打开条件断点设置对话框,如图2-13所示,该命令用于设置满足断点有效的条件。

当选择Stop on Errors 或Stop on Warnings 命令时,M 文件会在出现某种运行错误或警告时,停止程序运行。

通常的调试过程是先单击Run按钮,运行一遍M文件,针对系统给出的具体的出错信息,在适当的地方设置断点或条件断点,再次运行到断点位置(如图 2-14 所示),此时MATLAB 把运行控制权交给键盘,命令窗口出现“K>>”提示符(如图 2-15 所示),此时可以在命令窗口查询M文件运行过程中的所有变量,包括函数运行时的中间变量,运行到断点位置后,用户可以逐行运行并实时查询变量取值,从而逐渐找到错误所在并将其排除。

2.4.8 M文件分析工具

通过对M文件进行调试,可以对文件中的编写错误和运行错误进行纠正。完成了调试后,用户编写的M文件就可以正确地运行了,但可能运行效率还不是最优,这就需要通过MATLAB提供的分析工具对代码进行分析,然后有针对性地进行优化。

MATLAB 提供的M 文件分析工具包括Code Analyzer Report工具和Profiler工具,它们都有图形操作界面,使用简单方便,是MATLAB程序分析优化的必用工具。

1.Code Analyzer Report工具

Code Analyzer Report 工具可以分析用户M 文件中的错误或性能问题,用户可以先在代码编辑调试器中打开待分析的M文件,然后选择MATLAB工具菜单下的,即可得到图2-16所示的代码分析报告。

从图2-16 中可以看出,Code Analyzer Report 分析完成后,会返回一个浏览器界面下的分析报告,报告中包括被分析的M文件的路径,以及若干个分析结果。分析结果的格式是“行号:错误或问题报告”。

实际上,Code Analyzer Report 分析得到的报告并不一定必须要消除,要具体问题具体分析。当用户认可某一条分析结果时,可以单击分析结果中的行号。就可以快捷打开相应的M文件并定位到该行,用户就可以方便地修改代码了。

Code Analyzer Report 不仅可以分析单个M 文件,还可以分析一个文件夹下的所有M文件。在分析结果的主界面下,选择Rerun This Report 则分析单个M 文件,选择Run Report on Current Folder 则分析当前文件夹下的所有M 文件。

2.Profiler分析工具

Profiler 工具是 MATLAB 提供的另一个功能强大的代码分析工具。在 MATLAB 的Commond Window窗口输入profile viewer命令,出现图2-17 所示的Profiler图形界面。使用时,用户可以提前在Editor中打开M文件,然后运行Profiler分析工具。

单击图 2-17 中的“Start Profiling”按钮,就可以分析此 M 文件,分析结果如图 2-18所示。

从图 2-18 中可见,Profiler 分析结果给出了调用函数名称、调用次数、消耗总时间等信息,单击图2-18 中的“Self Time”,可以使M文件的分析报告按照Self Time 从大到小的方式排列,如图2-19所示。

图2-19显示了文件运行中最消耗时间的部分及其具体耗时信息。用户可以有针对性地修改那些最消耗时间的部分。

提示:一般来说,应该尽量避免不必要的变量输出,循环赋值前预定义数组尺寸,多采用向量化的MATLAB函数,少采用数组,这些都能够提高MATLAB程序的运行性能。

2.5 本章小结

数据类型、常量与变量是程序语言入门时必须引入的一些基本概念,MATLAB虽是一个集多种功能于一体的集成软件,但就其语言部分而言,这些概念同样不可缺少。与一般高级语言不同,在MATLAB中数组可作为一个独立的运算单位,直接进行类似简单变量的多种运算而无需采用循环结构,由此决定了数组在MATLAB中作为基本运算量的角色定位。

数据分析和处理在各个领域有着广泛的应用,尤其是在数学、物理等科学领域和工程领域的实际应用中,会经常遇到进行数据分析的情况。

MATLAB跟其他高级计算机语言一样,可以编写MATLAB程序进行程序设计,而与其他计算机语言比起来,有许多无法比拟的优点。本章针对以上内容,均做了详细的介绍。

相关图书

图神经网络:基础、前沿与应用
图神经网络:基础、前沿与应用
图神经网络前沿
图神经网络前沿
Python神经网络项目实战
Python神经网络项目实战
TensorFlow深度学习项目实战
TensorFlow深度学习项目实战
PyTorch深度学习和图神经网络(卷2)——开发应用
PyTorch深度学习和图神经网络(卷2)——开发应用
PyTorch深度学习和图神经网络(卷1)——基础知识
PyTorch深度学习和图神经网络(卷1)——基础知识

相关文章

相关课程