69
1 1 MATLAB MATLAB 概概 概概 1.1 MATLAB 1.1 MATLAB 的的的的的的的的 的的的的的的的的 MATLAB MATLAB MATrix LABoratory MATrix LABoratory “的的的的的” 的的的的 的的的的 ), “的的的的的” 的的的的 的的的的 ), MathWorks MathWorks 的的的的的的 的的的的的的 的的的的 的的的的 的的的的 的的的的 的的的的的 的的的的的 的的的的的的的 的的的的的 的的的的的的的的 的的的的的的的的的 一体,、。 的的的的的的的 的的的的的 的的的的的的的的 的的的的的的的的的 一体,、。 的的的的的的一。 的的的的的的一。 20 20 的的 的的 80 80 的的的的的的的的Cleve Moler Cleve Moler John Little John Little 的的的 的的的 C C 的的的的的的 的的 的的的的的的 的的 MA MA TLAB TLAB 的的 的的的 的的 的的的 MATLAB MATLAB 的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的的1984 1984 Cleve Cleve Moler Moler John Little John Little 的的的的的的 的的的的的的 Mathworks Mathworks 的的 的的 MATLAB MATLAB 的的的的的的 的的的的 的的的的的的 的的的的 MATLAB MATLAB 的的的的的的的的的的的的的的的的的的1993 1993 Mathworks Mathworks 的的的的的的的的的的的的的 的的的的的的的的的的的的的 MATLAB 4. MATLAB 4. 0 0 的的 的的 的的 的的 1997 1997 的的的的的 的的的的的 MATLAB 5.X MATLAB 5.X 的的的的Release 11 Release 11 的的 ), 的的 ), 2000 2000 的的的的的的 的的的的的的 的的 的的 MATLAB 6 MATLAB 6 的的的的Release 12 Release 12 )。 )。 的的的的MATLAB MATLAB 的的的的的的的的的的的的的的的的 的的的的的的的 ,, 的的的的的的的的的的的的的的的的 的的的的的的的 ,, MATLAB MATLAB 的的的的的的的的 的的的 的的的的的的的的 的的的 的的 的的的的 的的的的的 的的的的的的的 的的的的 的的的的的的的的的的的的的的的 的的的的的的的的 、、、、。, 的的 的的的的 的的的的的 的的的的的的的 的的的的 的的的的的的的的的的的的的的的 的的的的的的的的 、、、、。, MATLA MATLA B B 的的的的的的的的的的的的的的的的 的的的的的的的的的的的的的的 的的的的的的的的的的的的的的的的 ,、。 的的的的的的的的的的的的的的的的 的的的的的的的的的的的的的的 的的的的的的的的的的的的的的的的 ,、。

1 . MATLAB 概述

  • Upload
    king

  • View
    170

  • Download
    7

Embed Size (px)

DESCRIPTION

1 . MATLAB 概述. 1.1 MATLAB 的发展历程和影响. MATLAB 是 MATrix LABoratory (“矩阵实验室”)的缩写,是由美国 MathWorks 公司开发的集 数值计算 、 符号计算 和 图形可视化 三大基本功能于一体,功能强大、操作简单的语言。是国际公认的优秀数学应用软件之一。 - PowerPoint PPT Presentation

Citation preview

Page 1: 1 . MATLAB 概述

11 .. MATLABMATLAB 概述概述 1.1 MATLAB1.1 MATLAB 的发展历程和影响的发展历程和影响

MATLAB MATLAB 是是 MATrix LABoratoryMATrix LABoratory (“矩阵实验室”)的缩写,是由美(“矩阵实验室”)的缩写,是由美国国 MathWorks MathWorks 公司开发的集公司开发的集数值计算数值计算、、符号计算符号计算和和图形可视化图形可视化三大基本功能三大基本功能于一体,功能强大、操作简单的语言。是国际公认的优秀数学应用软件之一。于一体,功能强大、操作简单的语言。是国际公认的优秀数学应用软件之一。2020 世纪世纪 8080 年代初期,年代初期, Cleve MolerCleve Moler 与与 John LittleJohn Little 等利用等利用 CC 语言开发了语言开发了新一代的新一代的 MATLABMATLAB 语言,此时的语言,此时的 MATLABMATLAB 语言已同时具备了数值计算功能语言已同时具备了数值计算功能和简单的图形处理功能。和简单的图形处理功能。 19841984 年,年, Cleve MolerCleve Moler 与与 John LittleJohn Little 等正式成立等正式成立了了 MathworksMathworks 公司,把公司,把 MATLABMATLAB 语言推向市场,并开始了对语言推向市场,并开始了对 MATLABMATLAB 工具工具箱等的开发设计。箱等的开发设计。 19931993 年,年, MathworksMathworks 公司推出了基于个人计算机的公司推出了基于个人计算机的 MATMAT

LAB 4.0LAB 4.0 版本,到了版本,到了 19971997 年又推出了年又推出了 MATLAB 5.XMATLAB 5.X 版本(版本( Release 11Release 11 ),),并在并在 20002000 年又推出了最新的年又推出了最新的 MATLAB 6MATLAB 6 版本(版本( Release 12Release 12 )。)。现在,现在, MATLABMATLAB 已经发展成为适合多学科的大型软件,在世界各高校,已经发展成为适合多学科的大型软件,在世界各高校,MATLABMATLAB 已经成为线性代数、数值分析、数理统计、优化方法、自动控制、已经成为线性代数、数值分析、数理统计、优化方法、自动控制、数字信号处理、动态系统仿真等高级课程的基本教学工具。特别是最近几年,数字信号处理、动态系统仿真等高级课程的基本教学工具。特别是最近几年,MATLABMATLAB 在我国大学生数学建模竞赛中的应用,为参赛者在有限的时间内准在我国大学生数学建模竞赛中的应用,为参赛者在有限的时间内准确、有效的解决问题提供了有力的保证。确、有效的解决问题提供了有力的保证。

Page 2: 1 . MATLAB 概述

1.2 MATLAB1.2 MATLAB 语言的优点语言的优点概括地讲,整个概括地讲,整个 MATLABMATLAB 系统由两部分组成,即系统由两部分组成,即 MATLABMATLAB 内核及辅内核及辅助工具箱,两者的调用构成了助工具箱,两者的调用构成了 MATLABMATLAB 的强大功能。的强大功能。 MATLABMATLAB 语言以矩语言以矩阵为基本数据单位,包括控制流语句、函数、数据结构、输入输出及面向阵为基本数据单位,包括控制流语句、函数、数据结构、输入输出及面向对象等特点的高级语言,它具有以下主要特点:对象等特点的高级语言,它具有以下主要特点:11 )运算符和库函数极其丰富,语言简洁,编程效率高,)运算符和库函数极其丰富,语言简洁,编程效率高, MATLABMATLAB 除除了提供和了提供和 CC 语言一样的运算符号外,还提供广泛的矩阵和向量运算符。语言一样的运算符号外,还提供广泛的矩阵和向量运算符。22 )既具有结构化的控制语句(如)既具有结构化的控制语句(如 forfor 循环、循环、 whilewhile 循环、循环、 breakbreak 语句、语句、

ifif 语句和语句和 switchswitch 语句),又有面向对象的编程特性。语句),又有面向对象的编程特性。33 )图形功能强大。它既包括对二维和三维数据可视化、图像处理、动)图形功能强大。它既包括对二维和三维数据可视化、图像处理、动画制作等高层次的绘图命令,也包括可以修改图形及编制完整图形界面的、画制作等高层次的绘图命令,也包括可以修改图形及编制完整图形界面的、低层次的绘图命令。低层次的绘图命令。44 )功能强大的工具箱。工具箱可分为两类:功能性工具箱和学科性工)功能强大的工具箱。工具箱可分为两类:功能性工具箱和学科性工具箱。具箱。55 )易于扩充。除内部函数外,所有)易于扩充。除内部函数外,所有 MATLABMATLAB 的核心文件和工具箱文的核心文件和工具箱文件都是可读可改的源文件,用户可修改源文件和加入自己的文件。 件都是可读可改的源文件,用户可修改源文件和加入自己的文件。

Page 3: 1 . MATLAB 概述

2.1 MATLAB2.1 MATLAB 的安装的安装22 .. MATLABMATLAB 开发环境开发环境 ◆ ◆ MATLAB 6MATLAB 6 对硬件的要求对硬件的要求

CPUCPU 要求:要求: Pentium IIPentium II 、、 Pentium IIIPentium III 、、 AMD AthlonAMD Athlon 或者更高;或者更高;光驱:光驱: 88 倍速以上;倍速以上;内存:至少内存:至少 64MB64MB ,但推荐,但推荐 128MB128MB 以上;以上;硬盘:视安装方式不同要求不统一,但至少留硬盘:视安装方式不同要求不统一,但至少留 1GB1GB 用于安装;用于安装;显卡:显卡: 88 位;位;

◆ ◆ MATLAB 6MATLAB 6 对软件的要求对软件的要求Windows95 Windows95 、、 Window98Window98 、、 Windows NTWindows NT 或或 Windows2000Windows2000 ;;Word97Word97 或或 word2000word2000 等,用于使用等,用于使用 MATLAB NotebookMATLAB Notebook ;;Adobe Acrobat Reader Adobe Acrobat Reader 用于阅读用于阅读 MATLABMATLAB 的的 PDFPDF 的帮助信息。的帮助信息。MATLAB 6MATLAB 6 的安装和其它应用软件类似,可按照安装向导进行安装。 的安装和其它应用软件类似,可按照安装向导进行安装。

Page 4: 1 . MATLAB 概述

2.2 MATLAB2.2 MATLAB 的启动和退出的启动和退出与常规的应用软件相同,与常规的应用软件相同,

MATLABMATLAB 的启动也有多种方的启动也有多种方式,首先常用的方法就是双式,首先常用的方法就是双击桌面的击桌面的 MATLABMATLAB 图标,图标,也可以在开始菜单的程序选也可以在开始菜单的程序选项中选择项中选择 MATLABMATLAB 组件中组件中的快捷方式,当然也可以在的快捷方式,当然也可以在MATLABMATLAB 的安装路径的子目的安装路径的子目录中选择可执行文件“录中选择可执行文件“ MATMATLAB.exe”LAB.exe” 。。启动启动 MATLABMATLAB 后,将打后,将打

开一个开一个 MATLABMATLAB 的欢迎界的欢迎界面,随后打开面,随后打开 MATLABMATLAB 的的桌面系统(桌面系统( DesktopDesktop )如右)如右图所示。图所示。

Page 5: 1 . MATLAB 概述

2.3 MATLAB2.3 MATLAB 的桌面的桌面运行运行 MatlabMatlab 将会在计算机显示器上生成一个或者多个窗口。其中标题为将会在计算机显示器上生成一个或者多个窗口。其中标题为 MM

ATLABATLAB 的窗口是的窗口是 MATLABMATLAB 主要的图形用户界面,称为主要的图形用户界面,称为 MATLABMATLAB 桌面。与标桌面。与标准的准的 WINDOWSWINDOWS 应用程序界面相似,具有标题栏、菜单栏、工具条、状态栏、应用程序界面相似,具有标题栏、菜单栏、工具条、状态栏、窗口控制按钮和工作区。在工作区内根据不同的设置将显示一个或者多个不同窗口控制按钮和工作区。在工作区内根据不同的设置将显示一个或者多个不同功能的子窗口,并且同时只有一个窗口是活动的。这些窗口可以通过功能的子窗口,并且同时只有一个窗口是活动的。这些窗口可以通过 ViewView 菜菜单来进行打开或关闭,它们的名称及描述如下表所示。单来进行打开或关闭,它们的名称及描述如下表所示。

(1) (1) 命令窗口(命令窗口( Command WindowCommand Window ))命令窗口是对命令窗口是对 MATLABMATLAB 进行操作的主要载体,默认的情况下,启动进行操作的主要载体,默认的情况下,启动 MATLMATL

ABAB 时就会打开命令窗口。一般来说,时就会打开命令窗口。一般来说, MATLABMATLAB 的所有函数和命令都可以在的所有函数和命令都可以在命令窗口中执行。在命令窗口中执行。在 MATLABMATLAB 命令窗口中,命令的实现不仅可以由菜单操作命令窗口中,命令的实现不仅可以由菜单操作来实现,也可以由命令行操作来执行。来实现,也可以由命令行操作来执行。例如:例如:在命令窗口中输入在命令窗口中输入 sin(pi/5)sin(pi/5) ,然后单击回车键,则会得到该表达式的值,然后单击回车键,则会得到该表达式的值sinsin (( pi/5pi/5 ))ans=ans= 0.58780.5878

Page 6: 1 . MATLAB 概述

(2)(2) 历史窗口(历史窗口( Command HistoryCommand History ))历史命令窗口是历史命令窗口是 MATLAB6MATLAB6 新增添的一个用户界面窗口,默认设置下历史新增添的一个用户界面窗口,默认设置下历史

命令窗口会保留自安装时起所有命令的历史记录,并标明使用时间,以方便命令窗口会保留自安装时起所有命令的历史记录,并标明使用时间,以方便使用者的查询。而且双击某一行命令,即在命令窗口中执行该命令。使用者的查询。而且双击某一行命令,即在命令窗口中执行该命令。

(3) (3) 发行说明书窗口(发行说明书窗口( Launch PadLaunch Pad ))发行说明书窗口是发行说明书窗口是 MATLAB6MATLAB6 所特有的,用来说明用户所拥有的所特有的,用来说明用户所拥有的 MathwoMathwo

rksrks 公司产品的工具包、演示以及帮助信息。当选中该窗口中的某个组件之后,公司产品的工具包、演示以及帮助信息。当选中该窗口中的某个组件之后,可以打开相应的窗口工具包。可以打开相应的窗口工具包。

(4) (4) 当前目录窗口(当前目录窗口( Current Directory Current Directory ))在当前目录窗口中可显示或改变当前目录,还可以显示当前目录下的文件,在当前目录窗口中可显示或改变当前目录,还可以显示当前目录下的文件,

包括文件名、文件类型、最后修改时间以及该文件的说明信息等并提供搜索包括文件名、文件类型、最后修改时间以及该文件的说明信息等并提供搜索功能。功能。

(5)(5) 工作空间管理窗口(工作空间管理窗口( WorkspaceWorkspace ))工作空间管理窗口是工作空间管理窗口是 MATLABMATLAB 的重要组成部分。在工作空间管理窗口中的重要组成部分。在工作空间管理窗口中

将显示所有目前保存在内存中的将显示所有目前保存在内存中的 MATLABMATLAB 变量的变量名、数据结构、字节数变量的变量名、数据结构、字节数以及类型,而不同的变量类型分别对应不同的变量名图标。以及类型,而不同的变量类型分别对应不同的变量名图标。

Page 7: 1 . MATLAB 概述

2.4 MATLAB2.4 MATLAB 的帮助系统的帮助系统完善的帮助系统是任何应用软件必要的组成部分。完善的帮助系统是任何应用软件必要的组成部分。 MATLABMATLAB 提供了相当丰提供了相当丰富的帮助信息,同时也提供了获得帮助的方法。首先,可以通过桌面平台的富的帮助信息,同时也提供了获得帮助的方法。首先,可以通过桌面平台的【【 HelpHelp 】菜单来获得帮助,也可以通过工具栏的帮助选项获得帮助。此外,】菜单来获得帮助,也可以通过工具栏的帮助选项获得帮助。此外,

MATLABMATLAB 也提供了在命令窗口中的获得帮助的多种方法,在命令窗口中获得也提供了在命令窗口中的获得帮助的多种方法,在命令窗口中获得MATLABMATLAB 帮助的命令及说明列于下表中。其调用格式为:帮助的命令及说明列于下表中。其调用格式为:

命令命令 ++ 指定参数指定参数 命 令 命 令 说 明 说 明 docdoc 在帮助浏览器中显示指定函数的参考信息在帮助浏览器中显示指定函数的参考信息 helphelp 在命令窗口中显示在命令窗口中显示 MM文件帮助文件帮助 helpbrowserhelpbrowser 打开帮助浏览器,无参数打开帮助浏览器,无参数 helpwinhelpwin 打开帮助浏览器,并且见初始界面置于打开帮助浏览器,并且见初始界面置于 MATLABMATLAB函数的函数的

MM文件帮助信息文件帮助信息 lookforlookfor 在命令窗口中显示具有指定参数特征函数的在命令窗口中显示具有指定参数特征函数的 MM文件帮助文件帮助 webweb 显示指定的网络页面,默认为显示指定的网络页面,默认为 MATLABMATLAB帮助浏览器帮助浏览器

Page 8: 1 . MATLAB 概述

2.5 2.5 注释、标点符号注释、标点符号(( 11 )分号(;))分号(;)在一条命令的最后输入一个分号,在一条命令的最后输入一个分号, MatlabMatlab就不会在屏幕上显示这条命令就不会在屏幕上显示这条命令

的计算结果。的计算结果。在一行中输入多条命令,则可以用分号来做为间隔,且不显示计算结果。在一行中输入多条命令,则可以用分号来做为间隔,且不显示计算结果。(( 22 )逗号(,))逗号(,)在一行中输入多条命令,则可以用逗号来做为间隔,且显示计算结果。在一行中输入多条命令,则可以用逗号来做为间隔,且显示计算结果。(( 33 )三个连续句点(…))三个连续句点(…)续行符号,允许一条指令写在多行上。续行符号,允许一条指令写在多行上。(( 44 )百分号()百分号( %% ))在一个百分号后面的所有文本都被看作是一条注释,不被执行。注释语在一个百分号后面的所有文本都被看作是一条注释,不被执行。注释语

句中不能出现续行符号。句中不能出现续行符号。

Page 9: 1 . MATLAB 概述

3.1 3.1 变量与常量变量与常量3. MATLAB3. MATLAB 的数据类型 的数据类型

MATLABMATLAB 的数据类型主要包括:的数据类型主要包括:数字数字、、字符串字符串、、矩阵矩阵、、单元型数据单元型数据及及结构型数据结构型数据等。 等。

3.1.1 3.1.1 变量变量变量是任何程序设计语言的基本要素之一,变量是任何程序设计语言的基本要素之一, MATLABMATLAB 语言当然也不例外。语言当然也不例外。与常规的程序设计语言不同的是与常规的程序设计语言不同的是 MATLABMATLAB 并不要求事先对所使用的变量进并不要求事先对所使用的变量进行声明,也不需要指定变量类型行声明,也不需要指定变量类型,, MATLABMATLAB 语言会自动依据所赋予变量的语言会自动依据所赋予变量的值或对变量所进行的操作来识别变量的类型值或对变量所进行的操作来识别变量的类型。在赋值过程中如果赋值变量已。在赋值过程中如果赋值变量已存在时,存在时, MATLABMATLAB 语言将使用新值代替旧值,并以新值类型代替旧值类型。语言将使用新值代替旧值,并以新值类型代替旧值类型。在在 MATLABMATLAB 语言中变量的命名应遵循如下规则:语言中变量的命名应遵循如下规则:(( 11 )变量名区分大小写。)变量名区分大小写。(( 22 )变量名长度不超)变量名长度不超 3131 位,第位,第 3131 个字符之后的字符将被个字符之后的字符将被 MATLABMATLAB语言所忽略。语言所忽略。(( 33 )变量名以字母开头,可以是字母、数字、下划线组成,但不能使)变量名以字母开头,可以是字母、数字、下划线组成,但不能使用标点。用标点。

Page 10: 1 . MATLAB 概述

定义的所有变量的各种信息在定义的所有变量的各种信息在 WorkspaceWorkspace窗口中可以显示出来,包括 窗口中可以显示出来,包括 NaNameme 、、 SizeSize 、、 BytesBytes 和和 ClassClass四种信息。通过四种信息。通过WhoWho 和和 WhosWhos指令显示出来。指令显示出来。(( 11 )) WhoWho用来显示当前工作区中的所有变量的名称。用来显示当前工作区中的所有变量的名称。

>>who>>whoYour variables are:Your variables are:ans a b cans a b c(( 22 )) WhosWhos将以列表的形式显示所有变量的将以列表的形式显示所有变量的 NameName 、、 SizeSize 、、 BytesBytes 和和 ClassClass四种信息。四种信息。>>whos>>whos Name Size Bytes ClassName Size Bytes Class ans 1x1 8 double arrayans 1x1 8 double array a 1x1 8 double arraya 1x1 8 double array b 1x1 8 double arrayb 1x1 8 double array c 1x1 8 double arrayc 1x1 8 double arrayGrand total is 4 elements using 4 bytesGrand total is 4 elements using 4 bytes (( 33 )) Clear [Var]Clear [Var]该指令用来清除工作区中的变量。若不带参数则清除所有的变量,若指定参该指令用来清除工作区中的变量。若不带参数则清除所有的变量,若指定参数则清除指定的变量。数则清除指定的变量。

Page 11: 1 . MATLAB 概述

3.1.2 3.1.2 常量常量MATLABMATLAB 语言本身也具有一些预定义的变量,这些特殊的变量称为常语言本身也具有一些预定义的变量,这些特殊的变量称为常量。下表给出了量。下表给出了 MATLABMATLAB 语言中经常使用的一些常量值。语言中经常使用的一些常量值。

常 量 常 量 表 示 数 值 表 示 数 值 pipi 圆周率圆周率 epseps 浮点运算的相对精度浮点运算的相对精度 infinf 正无穷大正无穷大 NaNNaN 表示不定值表示不定值 realmaxrealmax 最大的浮点数最大的浮点数 i, ji, j 虚数单位虚数单位

在在 MATLABMATLAB 语言中,定义变量时应避免与常量名重复,以防改变这语言中,定义变量时应避免与常量名重复,以防改变这些常量的值,如果已改变了某个常量的值,可以通过“些常量的值,如果已改变了某个常量的值,可以通过“ clear+clear+ 常量名”常量名”命令恢复该常量的初始设定值(当然,也可通过重新启动命令恢复该常量的初始设定值(当然,也可通过重新启动 MATLABMATLAB 系统系统来恢复这些常量值)。来恢复这些常量值)。

Page 12: 1 . MATLAB 概述

2.4 2.4 复数复数MatlabMatlab 功能最强大的特性之一就是它在处理复数的时候,不需要任何功能最强大的特性之一就是它在处理复数的时候,不需要任何

其他操作。在其他操作。在 Matlab Matlab  中,有好几种方式来表示复数,常用的表示方式有中,有好几种方式来表示复数,常用的表示方式有如下几种:如下几种:

>>c1=1-2i>>c1=1-2ic1=c1= 1.0000-2.0000i1.0000-2.0000i>>c1=1-2j>>c1=1-2jc1=c1= 1.0000-2.0000i1.0000-2.0000i>>c2=3*(2-sqrt(-1)*3)>>c2=3*(2-sqrt(-1)*3)c2=c2= 6.0000-9.0000i6.0000-9.0000i>>c3=sqrt(-2)>>c3=sqrt(-2)c3=c3= 0+1.4142i0+1.4142i

Page 13: 1 . MATLAB 概述

>>c4=6+sin(0.5)*i>>c4=6+sin(0.5)*ic4=c4= 6.0000-0.4794i6.0000-0.4794i>>c5=6+sin(0.5)*j>>c5=6+sin(0.5)*jc5=c5= 6.0000-0.4794i6.0000-0.4794i在最后两个例子中,因为只有数字才能和在最后两个例子中,因为只有数字才能和 i,ji,j 直接连接,直接连接, sin(0.5)isin(0.5)i 和和 ss

in(0.5)jin(0.5)j没有任何意义,所以乘没有任何意义,所以乘 ii或者或者 jj 是必须的。是必须的。对复数的数学运算的写法与对实数的数学运算的写法是一样的。对复数的数学运算的写法与对实数的数学运算的写法是一样的。>>c6=(c1+c2)/c3>>c6=(c1+c2)/c3c6=c6= -7.7782-4.9497i-7.7782-4.9497i>>c6r=real(c6)>>c6r=real(c6)c6r=c6r= -7.7782-7.7782>>c6i=imag(c6)>>c6i=imag(c6)c6i=c6i= -4.9497-4.9497

Page 14: 1 . MATLAB 概述

3.2 3.2 矩阵和矩阵运算矩阵和矩阵运算3.2.1 3.2.1 简单矩阵简单矩阵定义一个矩阵,只需要将数值按顺序列表,放在一对方括号中,中间用空定义一个矩阵,只需要将数值按顺序列表,放在一对方括号中,中间用空

格间隔即可。如果将这个列表赋给一个变量,则这个变量即成为一个矩阵。格间隔即可。如果将这个列表赋给一个变量,则这个变量即成为一个矩阵。>> [1.1 2 3 4 5 6 7 8 9 10]>> [1.1 2 3 4 5 6 7 8 9 10]ans =ans = Columns 1 through 7 Columns 1 through 7 1.1000 2.0000 3.0000 4.0000 5.0000 6.0000 7.00001.1000 2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 Columns 8 through 10 Columns 8 through 10 8.0000 9.0000 10.00008.0000 9.0000 10.0000>> x=[1 2 3 4 5 6 7 8 9 10]>> x=[1 2 3 4 5 6 7 8 9 10]x = 1 2 3 4 5 6 7 8 9 10x = 1 2 3 4 5 6 7 8 9 10>> y=8*x>> y=8*xy = 8 16 24 32 40 48 56 64 72 80y = 8 16 24 32 40 48 56 64 72 80因为空格将因为空格将矩阵矩阵值分隔开了,所以值分隔开了,所以矩阵矩阵元素中的复数中不能间杂空格,除非元素中的复数中不能间杂空格,除非

这种带空格的表达式是用括号括起来的。这种带空格的表达式是用括号括起来的。[1 -2i 3 4 5+6i] [(1 -2i) 3 4 5+6i] [1-2i 3 4 5+6i][1 -2i 3 4 5+6i] [(1 -2i) 3 4 5+6i] [1-2i 3 4 5+6i]

Page 15: 1 . MATLAB 概述

3.2.2 3.2.2 矩阵寻址或者下标矩阵寻址或者下标单独的矩阵元素通过下标来访问,用小括号来表示。单独的矩阵元素通过下标来访问,用小括号来表示。>> x(3)>> x(3)ans = 3ans = 3为了同时访问一块数据,使用冒号。为了同时访问一块数据,使用冒号。>> x(1:6)>> x(1:6)ans = 1 2 3 4 5 6ans = 1 2 3 4 5 6>> y(5:end)>> y(5:end)ans = 40 48 56 64 72 80ans = 40 48 56 64 72 80除了可以给出元素的上下边界之外,还可以给出步长。除了可以给出元素的上下边界之外,还可以给出步长。>> x(5:-1:2)>> x(5:-1:2)ans = 5 4 3 2ans = 5 4 3 2>> y(3:2:7)>> y(3:2:7)ans = 24 40 56ans = 24 40 56还可以通过一个矩阵给定要输出的元素的下标值。还可以通过一个矩阵给定要输出的元素的下标值。>> y([8 4 6 1 1])>> y([8 4 6 1 1])ans = 64 32 48 8 8ans = 64 32 48 8 8

Page 16: 1 . MATLAB 概述

3.2.33.2.3 矩阵赋值矩阵赋值除了利用前一节的赋值列表赋值外,还可以利用冒号(:)表示法来赋值。除了利用前一节的赋值列表赋值外,还可以利用冒号(:)表示法来赋值。>> x=(0:0.2:1)*pi>> x=(0:0.2:1)*pix = 0 0.6283 1.2566 1.8850 2.5133 3.1416x = 0 0.6283 1.2566 1.8850 2.5133 3.1416>> x=linspace(0,pi,5) >> x=linspace(0,pi,5) x = 0 0.7854 1.5708 2.3562 3.1416x = 0 0.7854 1.5708 2.3562 3.1416linspace(first,last,num)linspace(first,last,num)创建从创建从 firstfirst 开始,到开始,到 lastlast 结束,共结束,共 numnum 个值的矩阵。个值的矩阵。>> x=logspace(0,2,6)>> x=logspace(0,2,6)x = 1.0000 2.5119 6.3096 15.8489 39.8107 100.0000x = 1.0000 2.5119 6.3096 15.8489 39.8107 100.0000logspace(first,last,num)logspace(first,last,num)创建从创建从 1010firstfirst 开始,到开始,到 1010lastlast 结束,共结束,共 numnum 个值的矩阵。个值的矩阵。除了上面的赋值形式之外,还允许使用下面的方式。除了上面的赋值形式之外,还允许使用下面的方式。>>a=[1:6]>>a=[1:6]>>b=[linspace(1,7,5)]>>b=[linspace(1,7,5)]>>a=(1:7)' >>a=(1:7)' % '% ' 为转置运算符为转置运算符>>a=1:5,b=1:2:9>>a=1:5,b=1:2:9>>d=[a(1:2:5) 1 0 1]>>d=[a(1:2:5) 1 0 1]

Page 17: 1 . MATLAB 概述

3.2.4 3.2.4 矩阵方向矩阵方向 上边创建的矩阵都是一行多列的行向量,也要以创建列向量。 上边创建的矩阵都是一行多列的行向量,也要以创建列向量。>> x=[1;2;3]>> x=[1;2;3]x =x = 1 1 2 2 3 3 利用转置操作符(’)和点-转置操作符(利用转置操作符(’)和点-转置操作符( .’.’ )可以将数组行列互)可以将数组行列互换。对于实数矩阵,两种操作符的效果是等价的。但对于复数来说,换。对于实数矩阵,两种操作符的效果是等价的。但对于复数来说,(( '' )给出的结果是复数共轭转置,虚部的符号改变。而()给出的结果是复数共轭转置,虚部的符号改变。而( .'.' )不进行)不进行共轭操作。共轭操作。>> y=x'>> y=x'y =y = 1 2 3 1 2 3>> y=x.'>> y=x.'y =y = 1 2 3 1 2 3>> d=y+y*i>> d=y+y*id =d = 1.0000 + 1.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i 1.0000 + 1.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i

Page 18: 1 . MATLAB 概述

>> e=d’>> e=d’e =e = 1.0000 - 1.0000i 1.0000 - 1.0000i 2.0000 - 2.0000i 2.0000 - 2.0000i 3.0000 - 3.0000i 3.0000 - 3.0000i>> e=d.’>> e=d.’e =e = 1.0000 + 1.0000i 1.0000 + 1.0000i 2.0000 + 2.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i 3.0000 + 3.0000i如果矩阵是多行多列的,可以用下面的方式来创建。如果矩阵是多行多列的,可以用下面的方式来创建。>> g=[1 2 3 4;5 6 7 8]>> g=[1 2 3 4;5 6 7 8]g =g = 1 2 3 4 1 2 3 4 5 6 7 8 5 6 7 8>> h=[1 2 3 4>> h=[1 2 3 4 5 6 7 8] 5 6 7 8]h =h = 1 2 3 4 1 2 3 4 5 6 7 8 5 6 7 8

Page 19: 1 . MATLAB 概述

3.2.5 3.2.5 标量-矩阵运算标量-矩阵运算 被标量加、减、乘、除都是简单地将这些运算应用到矩阵的所有元素被标量加、减、乘、除都是简单地将这些运算应用到矩阵的所有元素之上。之上。>> 2*g/5+1>> 2*g/5+1ans =ans = 1.4000 1.8000 2.2000 2.6000 1.4000 1.8000 2.2000 2.6000 3.0000 3.4000 3.8000 4.2000 3.0000 3.4000 3.8000 4.2000

3.2.6 3.2.6 矩阵-矩阵运算矩阵-矩阵运算 当两个矩阵有相同的维数的时候,加、减、乘、除就可以在元素对元当两个矩阵有相同的维数的时候,加、减、乘、除就可以在元素对元素的基础上应用。素的基础上应用。>> g+h>> g+hans =ans = 2 4 6 82 4 6 8 10 12 14 1610 12 14 16 元素对元素的乘、除与普通的乘、除法类似,但使用的点-乘和点-元素对元素的乘、除与普通的乘、除法类似,但使用的点-乘和点-除符号。除符号。

Page 20: 1 . MATLAB 概述

>> g.*h>> g.*hans =ans = 1 4 9 16 1 4 9 16 25 36 49 64 25 36 49 64>> g./h>> g./hans =ans = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1除此之外,还有点-乘方和点-倒数运算。除此之外,还有点-乘方和点-倒数运算。>> g.^2>> g.^2ans =ans = 1 4 9 16 1 4 9 16 25 36 49 64 25 36 49 64>> g.^h>> g.^hans =ans = 1 4 27 256 1 4 27 256 3125 46656 823543 16777216 3125 46656 823543 16777216>> g.^-1>> g.^-1ans =ans = 1.0000 0.5000 0.3333 0.2500 1.0000 0.5000 0.3333 0.2500 0.2000 0.1667 0.1429 0.1250 0.2000 0.1667 0.1429 0.1250

Page 21: 1 . MATLAB 概述

3.2.7 3.2.7 标准矩阵标准矩阵 标准矩阵包括全标准矩阵包括全 11 矩阵和全矩阵和全 00 矩阵,单位矩阵,随机矩阵,对角矩阵,矩阵,单位矩阵,随机矩阵,对角矩阵,以及元素为指定常数的矩阵。以及元素为指定常数的矩阵。>> ones(3)>> ones(3)       %ones(n):n*n%ones(n):n*n 的全的全 11 矩阵矩阵ans =ans = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1>> ones(2,4) >> ones(2,4)      %ones(r,c):r*c%ones(r,c):r*c 的全的全 11 矩阵矩阵ans =ans = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1>> zeros(3) %zeros(n):n*n>> zeros(3) %zeros(n):n*n 的全的全 00 矩阵矩阵ans =ans = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>> zeros(2,4) >> zeros(2,4)      %zeros(r,c):r*c%zeros(r,c):r*c 的全的全 00 矩阵矩阵ans =ans = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Page 22: 1 . MATLAB 概述

>> rand(3) %rand(n):n*n>> rand(3) %rand(n):n*n 的随机矩阵的随机矩阵ans = ans = 0.9501 0.4860 0.45650.9501 0.4860 0.4565 0.2311 0.8913 0.01850.2311 0.8913 0.0185 0.6068 0.7621 0.82140.6068 0.7621 0.8214>> rand(2,4) %rand(r,c):r*c>> rand(2,4) %rand(r,c):r*c 的随机矩阵的随机矩阵ans =ans = 0.4447 0.7919 0.7382 0.40570.4447 0.7919 0.7382 0.4057 0.6154 0.9218 0.1763 0.93550.6154 0.9218 0.1763 0.9355>> eye(3) %eye(n):n*n>> eye(3) %eye(n):n*n 的单位矩阵的单位矩阵ans =ans = 1 0 01 0 0 0 1 00 1 0 0 0 10 0 1>> eye(2,4) %eye(r,c):r*c>> eye(2,4) %eye(r,c):r*c 的单位矩阵的单位矩阵ans =ans = 1 0 0 01 0 0 0 0 1 0 00 1 0 0>> a=1:4>> a=1:4a =a = 1 2 3 41 2 3 4

Page 23: 1 . MATLAB 概述

>> diag(a)>> diag(a)ans =ans = 1 0 0 01 0 0 0 0 2 0 00 2 0 0 0 0 3 00 0 3 0 0 0 0 40 0 0 4>> diag(a,1)>> diag(a,1)ans =ans = 0 1 0 0 00 1 0 0 0 0 0 2 0 00 0 2 0 0 0 0 0 3 00 0 0 3 0 0 0 0 0 40 0 0 0 4 0 0 0 0 00 0 0 0 0>> diag(a,-1)>> diag(a,-1)ans =ans = 0 0 0 0 00 0 0 0 0 1 0 0 0 01 0 0 0 0 0 2 0 0 00 2 0 0 0 0 0 3 0 00 0 3 0 0 0 0 0 4 00 0 0 4 0函数函数 diagdiag 生成对角矩阵,一个向量可以被放在与矩阵的主对角线平行的任生成对角矩阵,一个向量可以被放在与矩阵的主对角线平行的任何位置上。何位置上。

Page 24: 1 . MATLAB 概述

3.2.8 3.2.8 矩阵大小矩阵大小获取数组大小的函数有获取数组大小的函数有 sizesize ,, lengthlength 和和 numelnumel 三个。三个。sizesize (( array[,n]array[,n] ):若省略参数):若省略参数 nn ,则函数按顺序返回数组,则函数按顺序返回数组 arrayarray 的行的行数列数的值;若有参数数列数的值;若有参数 nn ,则返回第,则返回第 nn 维的长度。维的长度。lengthlength (( arrayarray ):返回行数或列数中较大的那个值。):返回行数或列数中较大的那个值。numelnumel (( arrayarray ):返回一个数组中元素的总数。):返回一个数组中元素的总数。

3.2.9 3.2.9 矩阵排序矩阵排序 sortsort (( arrayarray ):返回一个或两个输出,第一个输出是输入参数的升序):返回一个或两个输出,第一个输出是输入参数的升序排列,第二个参数是排序结果的索引。排列,第二个参数是排序结果的索引。>> x=[7 5 2 1 3 6 4 8]>> x=[7 5 2 1 3 6 4 8]x =x = 7 5 2 1 3 6 4 8 7 5 2 1 3 6 4 8>> xs=sort(x)>> xs=sort(x)xs =xs = 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8

Page 25: 1 . MATLAB 概述

>> [xs,idx]=sort(x)>> [xs,idx]=sort(x)xs =xs = 1 2 3 4 5 6 7 81 2 3 4 5 6 7 8idx =idx = 4 3 5 7 2 6 1 84 3 5 7 2 6 1 8若要得到矩阵的降序排列,则必须用索引技术将结果前后调换。若要得到矩阵的降序排列,则必须用索引技术将结果前后调换。>> xsd=xs(end:-1:1)>> xsd=xs(end:-1:1)xsd =xsd = 8 7 6 5 4 3 2 18 7 6 5 4 3 2 1>> idxd=idx(end:-1:1)>> idxd=idx(end:-1:1)idxd =idxd = 8 1 6 2 7 5 3 48 1 6 2 7 5 3 4对二维矩阵排序时,是将每一列单独进行升序排列。若想按行排列,则对二维矩阵排序时,是将每一列单独进行升序排列。若想按行排列,则需要使用第二个参数,需要使用第二个参数, sort(array,2)sort(array,2) 。。

若想按某一列为依据,对整个数组进行排序,则可以用如下方法实现。若想按某一列为依据,对整个数组进行排序,则可以用如下方法实现。>>[tmp,idx]=sort(a(:,4));>>[tmp,idx]=sort(a(:,4));>>as=a(idx,:)>>as=a(idx,:)

Page 26: 1 . MATLAB 概述

3.2.10 3.2.10 应用举例应用举例例例 3.13.1 一维矩阵不同赋值方式示例。一维矩阵不同赋值方式示例。x=rand(1,5)x=rand(1,5) %%产生的均布随机矩阵产生的均布随机矩阵x =x =0.9501 0.2311 0.6068 0.4860 0.8913 0.9501 0.2311 0.6068 0.4860 0.8913 x(3)x(3) %%寻访矩阵寻访矩阵 xx 的第三个元素。的第三个元素。ans =ans =0.6068 0.6068 x([1 2 5])x([1 2 5]) %%寻访矩阵寻访矩阵 xx 的第一、二、五个元素组成的子矩阵。 的第一、二、五个元素组成的子矩阵。 ans =ans =0.9501 0.2311 0.8913 0.9501 0.2311 0.8913 x(1:3)x(1:3) %%寻访前三个元素组成的子矩阵寻访前三个元素组成的子矩阵ans =ans = 0.9501 0.2311 0.6068 0.9501 0.2311 0.6068 x(3:end)x(3:end) %%寻访除前寻访除前 22 个元素外的全部其他元素。个元素外的全部其他元素。 endend 是最后一个是最后一个元素的下标。 元素的下标。 ans =ans = 0.6068 0.4860 0.8913 0.6068 0.4860 0.8913

Page 27: 1 . MATLAB 概述

x(3:-1:1)x(3:-1:1) %% 由前三个元素倒排构成的子矩阵由前三个元素倒排构成的子矩阵ans =ans = 0.6068 0.2311 0.9501 0.6068 0.2311 0.9501 x(x(findfind(x>0.5)) %(x>0.5)) % 由大于由大于 0.50.5 的元素构成的子矩阵的元素构成的子矩阵ans =ans =0.9501 0.6068 0.8913 0.9501 0.6068 0.8913 x([1 2 3 4 4 3 2 1]) %x([1 2 3 4 4 3 2 1]) % 对元素可以重复寻访,使所得矩阵长度允许大于原对元素可以重复寻访,使所得矩阵长度允许大于原数矩阵。数矩阵。ans =ans = Columns 1 through 7 Columns 1 through 7 0.9501 0.2311 0.6068 0.4860 0.4860 0.6068 0.23110.9501 0.2311 0.6068 0.4860 0.4860 0.6068 0.2311 Column 8 Column 8 0.9501 0.9501例例 3.2 3.2 二维矩阵不同赋值方式示例。二维矩阵不同赋值方式示例。A=zeros(2,4)A=zeros(2,4) %% 创建的全零矩阵 创建的全零矩阵 A =A = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Page 28: 1 . MATLAB 概述

A(:)=1:8A(:)=1:8 %%全元素赋值方式 全元素赋值方式 A =A = 1 3 5 71 3 5 7 2 4 6 8 2 4 6 8 s=[2 3 5];s=[2 3 5]; %%产生单下标矩阵行矩阵产生单下标矩阵行矩阵A(s)A(s) %% 由“单下标行矩阵”寻访产生由“单下标行矩阵”寻访产生 AA元素组成的行矩阵元素组成的行矩阵Sa=[10 20 30]'Sa=[10 20 30]' %Sa%Sa 是长度为是长度为 33 的“列矩阵”的“列矩阵”A(s)=SaA(s)=Sa %% 单下标方式赋值单下标方式赋值 ans =ans = 2 3 52 3 5Sa =Sa = 1010 2020 3030A =A = 1 20 30 71 20 30 7 10 4 6 8 10 4 6 8 A(:,[2 3])=ones(2) %A(:,[2 3])=ones(2) %双下标赋值方式:把双下标赋值方式:把 AA 的第的第 22 、、 33列元素全赋为列元素全赋为 1 1 A =A = 1 1 1 71 1 1 7 10 1 1 8 10 1 1 8

Page 29: 1 . MATLAB 概述

3.3 3.3 字符串字符串3.3.1 3.3.1 字符串的构造字符串的构造一个字符串就是用单引号括起来的简单文本。每一个字符都是数组中的一一个字符串就是用单引号括起来的简单文本。每一个字符都是数组中的一个元素,每一个字符用两个字节来存储。个元素,每一个字符用两个字节来存储。>> t='How about this character string?'>> t='How about this character string?'t =t =How about this character string?How about this character string?>> whos>> whos Name Size Bytes ClassName Size Bytes Class t 1x32 64 char arrayt 1x32 64 char arrayGrand total is 32 elements using 64 bytesGrand total is 32 elements using 64 bytes在数值与字符之间的相互转换,可以使用在数值与字符之间的相互转换,可以使用 doubledouble 和和 charchar 函数。函数。>> t='abc'>> t='abc't =t =abcdeabcde>> u=double(t)>> u=double(t)u =u = 97 98 99 100 10197 98 99 100 101>> t=char(u+3)>> t=char(u+3)t =t =defghdefgh

Page 30: 1 . MATLAB 概述

因为字符串矩阵,因此它们可以用因为字符串矩阵,因此它们可以用 MatlabMatlab 中提供的所有处理工具进行处中提供的所有处理工具进行处理。例如:理。例如:>> u=t(end:-1:1)>> u=t(end:-1:1)u =u =hgfedhgfed函数函数 dispdisp 允许显示一个字符串而不用输出字符串的变量的变量名。允许显示一个字符串而不用输出字符串的变量的变量名。>> disp([t u])>> disp([t u])defghhgfeddefghhgfed字符串也可以是多行的,但是每一行都必须有相同的列数。因此,需要字符串也可以是多行的,但是每一行都必须有相同的列数。因此,需要显式的输入空格,使得所有行的长度相同。显式的输入空格,使得所有行的长度相同。>> v=['abc';'def';'gih']>> v=['abc';'def';'gih']v =v =abcabcdefdefgihgih>> v=['abc'>> v=['abc' 'def''def' 'gih']'gih']v =v =abcabcdefdefgihgih

Page 31: 1 . MATLAB 概述

函数函数 charchar 和和 strvcatstrvcat 利用各个不同长度的字符串生成多行字符串矩利用各个不同长度的字符串生成多行字符串矩阵。这两个函数的区别在于阵。这两个函数的区别在于 strvcatstrvcat 忽略空字符串输入,而忽略空字符串输入,而 charchar 遇到空遇到空字符串就插入一个空行。例如:字符串就插入一个空行。例如:

>> v=char('one','','two','three')>> v=char('one','','two','three')v =v =one one two two threethree>> v=strvcat('one','','two','three')>> v=strvcat('one','','two','three')v =v =one one two two threethree

Page 32: 1 . MATLAB 概述

同行数的字符串矩阵在水平方向上的连接是用函数同行数的字符串矩阵在水平方向上的连接是用函数 strcatstrcat来实现的。各字来实现的。各字符串中填补的空格将被去掉,连接完成之后,再在需要的地方补上空格。例如:符串中填补的空格将被去掉,连接完成之后,再在需要的地方补上空格。例如:>> a=char('abc','abcdef')>> a=char('abc','abcdef')a =a =abc abc abcdefabcdef>> b=char('hijkl','mnopqrst')>> b=char('hijkl','mnopqrst')b =b =hijkl hijkl mnopqrstmnopqrst>> c=strcat(a,b)>> c=strcat(a,b)c =c =abchijkl abchijkl abcdefmnopqrstabcdefmnopqrst这样在单独提取这样在单独提取 cc 的第一行时,将含有填补的空格可以用的第一行时,将含有填补的空格可以用 deblankdeblank将其删将其删除。除。>> deblank(c(1,:))>> deblank(c(1,:))ans =ans =abchijklabchijkl

Page 33: 1 . MATLAB 概述

3.3.2 3.3.2 转换函数产生数码字符串转换函数产生数码字符串最常用的矩阵最常用的矩阵 // 字符串转换函数字符串转换函数 int2str , num2str ,mat2strint2str , num2str ,mat2str 示例。示例。(( 11 )) int2strint2str 把整数矩阵转换成串矩阵(非整数将被四舍五入后再转换)把整数矩阵转换成串矩阵(非整数将被四舍五入后再转换)>>A=eye(2,4);>>A=eye(2,4); %% 生成一个生成一个 2*42*4 数值矩阵数值矩阵>>A_str1=int2str(A)>>A_str1=int2str(A) %%转换成转换成 2*102*10 串矩阵。可以用串矩阵。可以用 sizesize 检验。 检验。 A_str1 =A_str1 =1 0 0 01 0 0 00 1 0 0 0 1 0 0 (( 22 )) num2strnum2str 把非整数矩阵转换为串矩阵(常用于图形中,数据点的标把非整数矩阵转换为串矩阵(常用于图形中,数据点的标识)识)B=rand(2,4); B=rand(2,4); %% 生成数值矩阵生成数值矩阵B3=num2str(B,3)B3=num2str(B,3) %% 保持保持 33 位有效数字,转换为串 位有效数字,转换为串 B3 =B3 = 0.95 0.607 0.891 0.456 0.95 0.607 0.891 0.4560.231 0.486 0.762 0.01850.231 0.486 0.762 0.0185(( 33 )) mat2strmat2str 把数值矩阵转换成输入形态的串矩阵(常与把数值矩阵转换成输入形态的串矩阵(常与 evaleval指令配用)指令配用)B_str=mat2str(B,4)B_str=mat2str(B,4) %% 保持保持 44 位有效数字,转换为“矩阵输入形式”串 位有效数字,转换为“矩阵输入形式”串 B_str =B_str =[0.9501 0.6068 0.8913 0.4565;0.2311 0.486 0.7621 0.0185][0.9501 0.6068 0.8913 0.4565;0.2311 0.486 0.7621 0.0185]

Page 34: 1 . MATLAB 概述

3.3.3 3.3.3 串转换函数串转换函数fprintf, sprintf, sscanffprintf, sprintf, sscanf 的用法示例。的用法示例。a=rand(2,2);a=rand(2,2); %%产生产生 2*22*2 随机阵随机阵s1=num2str(a)s1=num2str(a) %% 把数值矩阵转换为串矩阵把数值矩阵转换为串矩阵s_s=sprintf(‘%.10e\n’,a) %10s_s=sprintf(‘%.10e\n’,a) %10 数位科学记述串数位科学记述串 ,,每写一个元素就换行。每写一个元素就换行。 s1 =s1 =0.95013 0.606840.95013 0.606840.23114 0.485980.23114 0.48598s_s =s_s =9.5012928515e-0019.5012928515e-0012.3113851357e-0012.3113851357e-0016.0684258354e-0016.0684258354e-0014.8598246871e-001 4.8598246871e-001 fprintf(‘%.5g\\’,a) fprintf(‘%.5g\\’,a) %% 以以 55 位数位最短形式显示。不能赋值用。 位数位最短形式显示。不能赋值用。 0.95013\0.23114\0.60684\0.48598\ 0.95013\0.23114\0.60684\0.48598\ s_sscan=sscanf(s_s,'%f',[3,2])%s_sscan=sscanf(s_s,'%f',[3,2])% 浮点格式把串转换成成浮点格式把串转换成成 3*23*2 数值矩阵。 数值矩阵。 s_sscan =s_sscan = 0.9501 0.4860 0.9501 0.4860 0.2311 0 0.2311 0 0.6068 0 0.6068 0

Page 35: 1 . MATLAB 概述

3.4 3.4 单元矩阵和结构单元矩阵和结构3.4.1 3.4.1 单元矩阵单元矩阵单元矩阵是元素为单元的单元矩阵是元素为单元的 MatlabMatlab 矩阵,在单元矩阵中的每一个单元矩阵,在单元矩阵中的每一个单元

都可以包含任何的都可以包含任何的 MatlabMatlab 数据类型,包括数值型矩阵、字符串、符号对数据类型,包括数值型矩阵、字符串、符号对象、其他单元矩阵以及结构。例如:象、其他单元矩阵以及结构。例如:

>> A(1,1)={[1 2 3;4 5 6;7 8 9]};>> A(1,1)={[1 2 3;4 5 6;7 8 9]};>> A(1,2)={2+3i}; >> A(1,2)={2+3i}; >> A(2,1)={'abcdefg'};>> A(2,1)={'abcdefg'};>> A(2,2)={12:-2:0}>> A(2,2)={12:-2:0}A = A = [3x3 double] [2.0000+ 3.0000i][3x3 double] [2.0000+ 3.0000i] 'abcdefg' [1x7 double]'abcdefg' [1x7 double]

Page 36: 1 . MATLAB 概述

3.4.2 3.4.2 结构结构结构允许用户将相异的数据集用一个单一的变量来组织,结构用被称结构允许用户将相异的数据集用一个单一的变量来组织,结构用被称

作域的名字来对结构元素进行寻址的,而不是象单元矩阵那样通过数字进作域的名字来对结构元素进行寻址的,而不是象单元矩阵那样通过数字进行元素寻址。结构用点号形式来访问域中的数据。例如:行元素寻址。结构用点号形式来访问域中的数据。例如:

>> B.i=2.5;>> B.i=2.5;>> B.j=[0,1];>> B.j=[0,1];>> B.m='--'>> B.m='--'B = B = i: 2.5000i: 2.5000 j: [0 1]j: [0 1] m: '--'m: '--'

Page 37: 1 . MATLAB 概述

4.1 4.1 流程控制流程控制计算机编程语言和可编程计算器提供许多功能,它允许你根据决策结构计算机编程语言和可编程计算器提供许多功能,它允许你根据决策结构

控制命令执行流程。控制命令执行流程。控制流极其重要,因为它使过去的计算影响将来的运算。控制流极其重要,因为它使过去的计算影响将来的运算。 MATLABMATLAB 提供提供

三种决策或控制流结构。它们是:三种决策或控制流结构。它们是: ForFor 循环,循环, WhileWhile 循环和循环和 If-Else-EndIf-Else-End 结结构。由于这些结构经常包含大量的构。由于这些结构经常包含大量的 MATLABMATLAB 命令,故经常出现在命令,故经常出现在 MM 文件文件中,而不是直接加在中,而不是直接加在 MATLABMATLAB 提示符下。提示符下。

4.MATLAB4.MATLAB 的程序设计的程序设计

Page 38: 1 . MATLAB 概述

4.1.1 for4.1.1 for 循环结构循环结构forfor 循环可使一组命令被反复执行一个固定的、预先指定的次数。循环可使一组命令被反复执行一个固定的、预先指定的次数。ForFor 循环的总体结构如下:循环的总体结构如下:for x=arrayfor x=array (commands)(commands)endendarrayarray 中有多少列,在中有多少列,在 forfor 和和 endend 语句之间的语句之间的 (commands)(commands) 就对应执行就对应执行

多少次。每重复一次,多少次。每重复一次, xx就被赋值为就被赋值为 arrayarray 的下一个列值;当循环结束时,的下一个列值;当循环结束时,x=array(:,n)x=array(:,n) 。例如:。例如:

>> for i=10:-1:1;>> for i=10:-1:1; x(i)=i*i;x(i)=i*i; endend>> x>> xx =x = 1 4 9 16 25 36 49 64 81 1001 4 9 16 25 36 49 64 81 100

Page 39: 1 . MATLAB 概述

ForFor 循环的其它重要方面是:循环的其它重要方面是:1. For1. For 循环不能用循环不能用 ForFor 循环内重新赋值循环变量循环内重新赋值循环变量 nn 来终止。来终止。 » for n=1:10» for n=1:10 x(n)=sin(n*pi/10);x(n)=sin(n*pi/10); n=10;n=10; endend 2. 2. 在在 ForFor 循环内接受任何有效的循环内接受任何有效的 MATLABMATLAB 数组。数组。 » data=[3 9 45 6; 7 16 -1 5]» data=[3 9 45 6; 7 16 -1 5] data =data = 3 9 45 63 9 45 6 7 16 -1 57 16 -1 5 for n=datafor n=data x=n(1)-n(2)x=n(1)-n(2) end end

Page 40: 1 . MATLAB 概述

3. For3. For 循环可按需要嵌套。循环可按需要嵌套。 for n=1:5for n=1:5 for m=5:-1:1for m=5:-1:1 A(n,m)=n^2+m^2;A(n,m)=n^2+m^2; end end disp(n)disp(n) endend 4. 4. 当有一个等效的数组方法来解给定的问题时,应避免用当有一个等效的数组方法来解给定的问题时,应避免用 ForFor 循环。循环。 » n=1:10;» n=1:10; » x=sin(n*pi/10)» x=sin(n*pi/10) 5. 5. 为了得到最大的速度,在为了得到最大的速度,在 ForFor 循环循环 (While(While 循环循环 )) 被执行之前,应预先被执行之前,应预先分配数组。分配数组。 »x=zeros(1,10); % preallocated memory for x»x=zeros(1,10); % preallocated memory for x » for n=1:10» for n=1:10 x(n)=sin(n*pi/10);x(n)=sin(n*pi/10); endend

Page 41: 1 . MATLAB 概述

4.1.2 while4.1.2 while 循环结构循环结构While While 循环以不定的次数求一组语句的值。总体结构如下:循环以不定的次数求一组语句的值。总体结构如下:while expressionwhile expression (commands)(commands)EndEnd只要在表达式只要在表达式 expressionexpression 里的所有元素为真,就执行里的所有元素为真,就执行 whilewhile 和和 end end

语句之间的语句之间的 {commands}{commands} 。通常,表达式的求值给出一个标量值,但数组。通常,表达式的求值给出一个标量值,但数组值也同样有效。在数组情况下,所得到数组的所有元素必须都为真。 值也同样有效。在数组情况下,所得到数组的所有元素必须都为真。

Page 42: 1 . MATLAB 概述

FibonacciFibonacci 数组的元素满足数组的元素满足 Fibonacci Fibonacci 规则:规则: a(1)=1a(1)=1 ,, a(2)=1a(2)=1 ; ; a(ia(i+1)=a(i-1)+a(i+1)+1)=a(i-1)+a(i+1) 且且 i>2i>2 。现要求该数组中第一个大于。现要求该数组中第一个大于 1000010000 的元素。的元素。

>>a(1)=1;a(2)=1;i=2;>>a(1)=1;a(2)=1;i=2;while a(i)<=10000while a(i)<=10000

a(i+1)=a(i-1)+a(i); a(i+1)=a(i-1)+a(i); %%当现有的元素仍小于当现有的元素仍小于 1000010000 时,求解下时,求解下一个元素。一个元素。

i=i+1;i=i+1;end;end;>>i,a(i)>>i,a(i)i =i = 21 21 ans =ans = 1094610946

Page 43: 1 . MATLAB 概述

4.1.3 if-else-end4.1.3 if-else-end 分支结构分支结构很多情况下,命令的序列必须根据关系的检验有条件地执行。在编程很多情况下,命令的序列必须根据关系的检验有条件地执行。在编程

语言里,这种逻辑由某种语言里,这种逻辑由某种 If-Else-EndIf-Else-End 结构来提供。最简单的结构来提供。最简单的 If-Else-EnIf-Else-Endd 结构是:结构是:

if expressionif expression {commands}{commands}endend如果在表达式中的所有元素为真如果在表达式中的所有元素为真 (( 非零非零 )) ,那么就执行,那么就执行 ifif 和和 endend 语言语言

之间的之间的 {commands}{commands} 。。一个简单的分支结构。一个简单的分支结构。>>cost=10;number=12;>>cost=10;number=12;if number>8if number>8 sums=number*0.95*cost;sums=number*0.95*cost;endend在表达式包含有几个逻辑子表达式时,即使前一个子表达式决定了表在表达式包含有几个逻辑子表达式时,即使前一个子表达式决定了表

达式的最后逻辑状态,仍要计算所有的子表达式。 达式的最后逻辑状态,仍要计算所有的子表达式。

Page 44: 1 . MATLAB 概述

假如有两个选择,假如有两个选择, If-Else-EndIf-Else-End 结构是:结构是:if expression if expression commands evaluated if True commands evaluated if True elseelse commands evaluated if Falsecommands evaluated if Falseendend如果表达式为真,执行第一组命令;如果表达式是假,执行第二组命令。如果表达式为真,执行第一组命令;如果表达式是假,执行第二组命令。当有三个或更多的选择时,当有三个或更多的选择时, If-Else-EndIf-Else-End 结构采用形式结构采用形式 ::if expression1if expression1 commands evaluated if expression1 is True commands evaluated if expression1 is True elseif expression2elseif expression2 commands evaluated if expression2 is True commands evaluated if expression2 is True elseif ……elseif …… .. .. ..elseelse commands evaluated if no other expression is True commands evaluated if no other expression is True endend

Page 45: 1 . MATLAB 概述

最后的这种形式,只和所碰到的、与第一个真值表达式相关的命令被执行;最后的这种形式,只和所碰到的、与第一个真值表达式相关的命令被执行;接下来的关系表达式不检验,跳过其余的接下来的关系表达式不检验,跳过其余的 If-Else-EndIf-Else-End 结构。而且,最后的结构。而且,最后的 elelsese 命令可有可无。命令可有可无。

利用利用 If-Else-EndIf-Else-End 结构来控制,得到一种合理的方法来跳出或中断结构来控制,得到一种合理的方法来跳出或中断 ForFor 循循环和环和 WhileWhile 循环。循环。

» EPS=1;» EPS=1;» for num=1:1000» for num=1:1000     EPS=EPS/2;EPS=EPS/2;     if (1+EPS)<=1if (1+EPS)<=1       EPS=EPS*2EPS=EPS*2

breakbreakendend

   endend当执行当执行 break break 语句时,语句时, MATLABMATLAB 跳到循环外下一个语句。在现在情况下,跳到循环外下一个语句。在现在情况下,

它返回到它返回到 MATLABMATLAB 的提示符并显示的提示符并显示 EPSEPS 。如果一个。如果一个 breakbreak 语句出现在一个语句出现在一个嵌套的嵌套的 ForFor 循环或循环或 WhileWhile 循环结构里,那么循环结构里,那么 MATLABMATLAB 只跳出只跳出 breakbreak 所在的那所在的那个循环,不跳出整个嵌套结构。个循环,不跳出整个嵌套结构。

Page 46: 1 . MATLAB 概述

4.1.4 switch-case4.1.4 switch-case 结构结构多分支选择结构,格式如下:多分支选择结构,格式如下:switch expressionswitch expression case test_expression1case test_expression1 (commands1)(commands1) case {test_expression2[,test_expression3[,…]]}case {test_expression2[,test_expression3[,…]]} (commands2)(commands2) …… …… otherwiseotherwise (commandsn)(commandsn)endendexpressionexpression 必须是一个标量或者是一个字符串。必须是一个标量或者是一个字符串。>> switch x>> switch x case {'Y','y'}case {'Y','y'} y='Yes';y='Yes'; case {'N','n'}case {'N','n'} y='No';y='No'; otherwiseotherwise y='Error';y='Error'; endend

Page 47: 1 . MATLAB 概述

4.2 4.2 关系和逻辑运算符关系和逻辑运算符除了传统的数学运算之外,除了传统的数学运算之外, MatlabMatlab 还支持关系和逻辑运算。这些还支持关系和逻辑运算。这些

操作符和函数的目的是提供求解真操作符和函数的目的是提供求解真 // 假命题的答案。一个重要的应用是假命题的答案。一个重要的应用是控制基于真控制基于真 // 假命题的一系列假命题的一系列 MATLABMATLAB 命令(通常在命令(通常在 MM 文件中)的流文件中)的流程,或执行次序。程,或执行次序。

作为所有关系和逻辑表达式的输入值,作为所有关系和逻辑表达式的输入值, MatlabMatlab 把所有的非把所有的非 00 数值数值当作当作 truetrue ,而把,而把 00 当作当作 falsefalse 。所有关系和逻辑表达式,如果为真就返。所有关系和逻辑表达式,如果为真就返回逻辑数组回逻辑数组 11 ,如果为假,就返回逻辑数组,如果为假,就返回逻辑数组 00 。。

Page 48: 1 . MATLAB 概述

关系运算符关系运算符 描 述 描 述<< 小于小于<=<= 小于等于小于等于>> 大于大于>=>= 大于等于大于等于==== 等于等于~=~= 不等于不等于

例如下面的例子例如下面的例子 ::>> A=1:9,B=9-A>> A=1:9,B=9-AA =A = 1 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 9B =B = 8 7 6 5 4 3 2 1 08 7 6 5 4 3 2 1 0>> tf=A>=B>> tf=A>=Btf =tf = 0 0 0 0 1 1 1 1 10 0 0 0 1 1 1 1 1>> tf=A==B>> tf=A==Btf =tf = 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0>> tf=A<=5>> tf=A<=5tf =tf = 1 1 1 1 1 0 0 0 01 1 1 1 1 0 0 0 0

4.2.1 4.2.1 关系运算符关系运算符MatlabMatlab 的关系运算符包括所有常用的比较运算符,如下表所示:的关系运算符包括所有常用的比较运算符,如下表所示:

Page 49: 1 . MATLAB 概述

下面演示,表明如何用特殊的下面演示,表明如何用特殊的 MATLABMATLAB 数数 epseps 来代替在一个数组中的来代替在一个数组中的零元素,零元素, epseps 近似为近似为 2.2e-162.2e-16 。这种特殊的表达式在避免被。这种特殊的表达式在避免被 00 除时是很有用除时是很有用的。的。

» x=(-3:3)/3» x=(-3:3)/3x =x =

-1.0000 -0.6667 -0.3333 0 0.3333 0.6667 1.0000-1.0000 -0.6667 -0.3333 0 0.3333 0.6667 1.0000» sin(x)./x» sin(x)./xWarning: Divide by zeroWarning: Divide by zeroans =ans =

0.8415 0.9276 0.9816 NaN 0.9816 0.9276 0.84150.8415 0.9276 0.9816 NaN 0.9816 0.9276 0.8415由于第四个数据是由于第四个数据是 0 0 ,计算函数,计算函数 sin(x)/xsin(x)/x 时给出了一个警告。由于时给出了一个警告。由于 sinsin

(0)/0(0)/0 是没定义的,在该处结果返回是没定义的,在该处结果返回 NaNNaN 。用。用 epseps 替代替代 00 以后,再试一次,以后,再试一次,» x=x+(x==0)*eps;» x=x+(x==0)*eps;» sin(x)./x» sin(x)./xans =ans =

0.8415 0.9276 0.9816 1.0000 0.9816 0.9276 0.84150.8415 0.9276 0.9816 1.0000 0.9816 0.9276 0.8415现在现在 sin(x)/xsin(x)/x 在在 x=0x=0 处给出了正确的极限。处给出了正确的极限。

Page 50: 1 . MATLAB 概述

4.2.2 4.2.2 逻辑运算符逻辑运算符逻辑运算符提供了将多个关系表达式组合在一起,或者对关系表达式取反的方逻辑运算符提供了将多个关系表达式组合在一起,或者对关系表达式取反的方

法,逻辑运算符包括如下表所示的三个。法,逻辑运算符包括如下表所示的三个。逻辑运算符逻辑运算符 描 述 描 述

&& 逻辑与逻辑与|| 逻辑或逻辑或~~ 逻辑非逻辑非

例如下面的例子例如下面的例子 ::>> A=1:9,B=9-A>> A=1:9,B=9-AA =A = 1 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 9B =B = 8 7 6 5 4 3 2 1 08 7 6 5 4 3 2 1 0>> tf=(A>2) & (A<6)>> tf=(A>2) & (A<6)tf =tf = 0 0 1 1 1 0 0 0 00 0 1 1 1 0 0 0 0>> tf=(A>8) | (A<3)>> tf=(A>8) | (A<3)tf =tf = 1 1 0 0 0 0 0 0 11 1 0 0 0 0 0 0 1>> tf=~(A<5)>> tf=~(A<5)tf =tf = 0 0 0 0 1 1 1 1 10 0 0 0 1 1 1 1 1

Page 51: 1 . MATLAB 概述

上面的功能易于产生数组来表示不连续信号,或由多段其他信号所组成上面的功能易于产生数组来表示不连续信号,或由多段其他信号所组成的信号。基本想法是,把数组中要保持的那些值与的信号。基本想法是,把数组中要保持的那些值与 11 相乘,所有其他值与相乘,所有其他值与 00

相乘。例如,相乘。例如,» x=linspace(0, 10, 100); % create data» x=linspace(0, 10, 100); % create data

» y=sin(x) ; % compute sine» y=sin(x) ; % compute sine

» z=(y>=0).*y ; % set negative values of sin(x) to zero» z=(y>=0).*y ; % set negative values of sin(x) to zero

» z=z+0.5*(y<0) ; % where sin(x) is negative add 1/2» z=z+0.5*(y<0) ; % where sin(x) is negative add 1/2

» z=(x<=8).*z ; % set values past x=8 to zero» z=(x<=8).*z ; % set values past x=8 to zero

» plot(x, z)» plot(x, z)

» xlabel(' x '), ylabel(' z=f(x) '), title(' A Discontinuous Signal ')» xlabel(' x '), ylabel(' z=f(x) '), title(' A Discontinuous Signal ')

Page 52: 1 . MATLAB 概述

0 2 4 6 8 100

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

x

z=f(x

)

A Discontinuous Signal

Page 53: 1 . MATLAB 概述

4.2.3 4.2.3 关系与逻辑函数关系与逻辑函数 除了上面的关系与逻辑操作符,除了上面的关系与逻辑操作符, MATLABMATLAB 提供了大量的其他关系与逻辑函数,提供了大量的其他关系与逻辑函数,

包括: 包括: 其 他 关 系 与 逻 辑 函 数

xor(x,y) 异或运算。 x 或 y 非零 ( 真 ) 返回 1 , x 和 y 都是零 ( 假 ) 或都是非零 ( 真 ) 返回 0 。any(x) 如果在一个向量 x 中,任何元素是非零,返回 1 ;矩阵 x 中的每一列有非零元素,返回 1 。all(x) 如果在一个向量 x 中,所有元素非零,返回 1 ;矩阵 x 中的每一列所有元素非零,返回 1 。

Page 54: 1 . MATLAB 概述

4.2.4 NaNs4.2.4 NaNs 和空矩阵和空矩阵 NaNsNaNs 和空矩阵和空矩阵 ([ ])([ ]) 要求在要求在 MATLABMATLAB 中作特殊处理,特别是用在逻辑或关系中作特殊处理,特别是用在逻辑或关系

表达式里。根据表达式里。根据 IEEEIEEE 数学标准,对数学标准,对 NaNsNaNs 的几乎所有运算都得出的几乎所有运算都得出 NaNsNaNs 。。当当 NaNNaN 与与 NaNNaN相比较时,相比较时, (a= =nan)(a= =nan)产生全部为产生全部为 00或假的结果,同时或假的结果,同时 (a~ =n(a~ =n

an)an)产生全部产生全部 11或真值。于是,单个或真值。于是,单个 NaNsNaNs相互不相等。由于相互不相等。由于 NaNsNaNs 的这种特性,的这种特性,MATLABMATLAB 有一个内置逻辑函数寻找有一个内置逻辑函数寻找 NaNsNaNs 。。

» a=[1 2 nan inf nan] % note,in use, NaN can be lowercase» a=[1 2 nan inf nan] % note,in use, NaN can be lowercase » g=isnan(a)» g=isnan(a) g =g = 0 0 1 0 10 0 1 0 1 这个函数用这个函数用 findfind 命令能找出命令能找出 NaNsNaNs 的下标值。例如,的下标值。例如, » i=find(isnan(a)) % find indices of NaNs» i=find(isnan(a)) % find indices of NaNs i =i = 3 53 5 » a(i)=zeros(size(i)) % changes NaNs in a to zeros» a(i)=zeros(size(i)) % changes NaNs in a to zeros a =a = 1 2 0 Inf 01 2 0 Inf 0

Page 55: 1 . MATLAB 概述

空矩阵是简单的,它们是空矩阵是简单的,它们是 MATLABMATLAB 大小为零的变量。大小为零的变量。» size([ ])» size([ ]) ans =ans = 0 00 0当没有其它合适的结果时,在当没有其它合适的结果时,在 MATLABMATLAB 中的许多函数返回空矩阵。或许最普中的许多函数返回空矩阵。或许最普

通的例子是函数通的例子是函数 findfind ::» x=(1:5)-3 % new data » x=(1:5)-3 % new data x =x = -2 -1 0 1 2-2 -1 0 1 2» y=find(x>2)» y=find(x>2) y =y = [ ][ ] 在这个例子里,在这个例子里, xx没有包含大于没有包含大于 22 的值,所以没有返回下标。为了测试空结的值,所以没有返回下标。为了测试空结

果,果, MATLABMATLAB 提供了逻辑函数提供了逻辑函数 isemptyisempty 。。» isempty(y)» isempty(y) ans =ans = 11

Page 56: 1 . MATLAB 概述

4.3 M4.3 M脚本文件脚本文件对于简单的问题而言,在对于简单的问题而言,在 CommandCommand 管口的提示符下输入用户的指管口的提示符下输入用户的指

令快速且方便。但是随着指令的增多,或者在用户希望改变一个或者多令快速且方便。但是随着指令的增多,或者在用户希望改变一个或者多个变量的值并且重复一些指令的时候,这样做就变得非常烦琐。个变量的值并且重复一些指令的时候,这样做就变得非常烦琐。 MatlabMatlab允许用户将指令输入到一个简单的文本文件中,然后去打开这个文件,允许用户将指令输入到一个简单的文本文件中,然后去打开这个文件,再执行这个文件中的指令。这种文件称为脚本文件,简称为再执行这个文件中的指令。这种文件称为脚本文件,简称为 MM 文件。扩文件。扩展名为“展名为“ *.m”*.m” 。。

为了生成为了生成 MM 文件,单击文件,单击 FileFile菜单下的菜单下的 NewNew菜单项,或者单击工具栏菜单项,或者单击工具栏上的空白页图标,然后选择上的空白页图标,然后选择 M-FileM-File 。打开一个文本编辑窗口,输入指令,。打开一个文本编辑窗口,输入指令,最后以某一文件名存盘。然后通过单击编辑器窗口工具栏上的最后以某一文件名存盘。然后通过单击编辑器窗口工具栏上的 RunRun 图标,图标,就可以立即执行该文件。 就可以立即执行该文件。

Page 57: 1 . MATLAB 概述

在在 MM 文件中常用的几个非常有用的函数如下表。文件中常用的几个非常有用的函数如下表。

函 数 函 数 描 述 描 述beepbeep “ ”计算机发出 嘟嘟 声“ ”计算机发出 嘟嘟 声disp(varname)disp(varname) 只显示结果,不显示变量名只显示结果,不显示变量名echoecho 控制控制 MM文件的内容在文件的内容在 CommandCommand窗口的显示输窗口的显示输出出inputinput 提示用户输入数据提示用户输入数据keybordkeybord 临时中止临时中止 MM文件的执行,直至按回车键文件的执行,直至按回车键pause or pause(n)pause or pause(n) 暂停,直至按下任意键,或者暂停暂停,直至按下任意键,或者暂停 nn秒后继续执秒后继续执行行waitforbuttonpreswaitforbuttonpresss 暂停,直至按下鼠标键或者键盘按键为止暂停,直至按下鼠标键或者键盘按键为止

Page 58: 1 . MATLAB 概述

4.3 M4.3 M 文件函数文件函数使用使用 MATLABMATLAB 函数时,例如函数时,例如 inv, abs, angleinv, abs, angle 和和 sqrtsqrt ,, MATMAT

LABLAB 获取传递给它的变量,利用所给的输入,计算所要求的结果。获取传递给它的变量,利用所给的输入,计算所要求的结果。然后,把这些结果返回。由函数执行的命令,以及由这些命令所创然后,把这些结果返回。由函数执行的命令,以及由这些命令所创建的中间变量,都是隐含的。所有可见的东西是输入和输出,也就建的中间变量,都是隐含的。所有可见的东西是输入和输出,也就是说函数是一个黑箱。是说函数是一个黑箱。这些属性使得函数成为强有力的工具,用以计算命令。这些命这些属性使得函数成为强有力的工具,用以计算命令。这些命

令包括在求解一些大的问题时,经常出现的有用的数学函数或命令令包括在求解一些大的问题时,经常出现的有用的数学函数或命令序列。由于这个强大的功能,序列。由于这个强大的功能, MATLABMATLAB 提供了一个创建用户函数提供了一个创建用户函数的结构,并以的结构,并以 MM 文件的文本形式存储在计算机上。 文件的文本形式存储在计算机上。

MATLABMATLAB 语言中,相对于脚本文件而言,函数文件是较为复杂语言中,相对于脚本文件而言,函数文件是较为复杂的。函数需要给定输入参数,并能够对输入变量进行若干操作,实的。函数需要给定输入参数,并能够对输入变量进行若干操作,实现特定的功能,最后给出一定的输出结果或图形等,其操作对象为现特定的功能,最后给出一定的输出结果或图形等,其操作对象为函数的输入变量和函数内的局部变量等。函数的输入变量和函数内的局部变量等。

Page 59: 1 . MATLAB 概述

MATLABMATLAB 语言的函数文件包含如下语言的函数文件包含如下 55 个部分。个部分。函数题头:函数题头:指函数的定义行,是函数语句的第一行,在该行中指函数的定义行,是函数语句的第一行,在该行中

将定义函数名、输入变量列表及输出变量列表等。将定义函数名、输入变量列表及输出变量列表等。HIHI 行:行:指函数帮助文本的第一行,为该函数文件的帮助主题,指函数帮助文本的第一行,为该函数文件的帮助主题,

当使用当使用 lookforlookfor 命令时,可以查看到该行信息。命令时,可以查看到该行信息。帮助信息:帮助信息:这部分提供了函数的完整的帮助信息,包括这部分提供了函数的完整的帮助信息,包括 HIHI 之后之后

至第一个可执行行或空行为止的所有注释语句,通过至第一个可执行行或空行为止的所有注释语句,通过 MATLABMATLAB 语语言的帮助系统查看函数的帮助信息时,将显示该部分。言的帮助系统查看函数的帮助信息时,将显示该部分。

函数体;函数体;指函数代码段,也是函数的主体部分。指函数代码段,也是函数的主体部分。注释部分:注释部分:指对函数体中各语句的解释和说明文本,注释语句指对函数体中各语句的解释和说明文本,注释语句

是以是以 %% 引导的。引导的。

Page 60: 1 . MATLAB 概述

例如:例如: function [outputfunction [output ,, output2]=function_exampleoutput2]=function_example (( input1input1 ,, input2input2 ) ) % % 函数题头函数题头 %This is function to exchange two matrices % HI%This is function to exchange two matrices % HI 行行 %input1%input1 ,, input2 are input variables % input2 are input variables % 帮助信息帮助信息 %output1%output1 ,, output2 are output variables % output2 are output variables % 帮助信息帮助信息 output1=input2output1=input2 ; ; % % 函数体函数体 output2=input1output2=input1 ; ; % % 函数体函数体 %The end of this example function%The end of this example function变量为局部变量,只在本函数文件内起作用。变量为局部变量,只在本函数文件内起作用。注意:格式、注释、函数名。注意:格式、注释、函数名。

Page 61: 1 . MATLAB 概述

MM 文件函数必须遵循以下特定的规则。除此之外,它们有许多的重要属文件函数必须遵循以下特定的规则。除此之外,它们有许多的重要属性。包括:性。包括:

1. 1. 函数名和文件名必须相同。例如,函数函数名和文件名必须相同。例如,函数 fliplr fliplr 存储在名为存储在名为 fliplr.m fliplr.m 文文件中。件中。

2. MATLAB2. MATLAB 头一次执行一个头一次执行一个 MM 文件函数时,它打开相应的文本文件并文件函数时,它打开相应的文本文件并将命令编辑成存储器的内部表示,以加速执行以后所有的调用。如果函数将命令编辑成存储器的内部表示,以加速执行以后所有的调用。如果函数包含了对其它包含了对其它 MM 文件函数的引用,它们也同样被编译到存储器。普通的脚文件函数的引用,它们也同样被编译到存储器。普通的脚本本 MM 文件不被编译,即使它们是从函数文件不被编译,即使它们是从函数 MM 文件内调用;打开脚本文件内调用;打开脚本 MM 文件,文件,调用一次就逐行进行注释。调用一次就逐行进行注释。

3. 3. 在函数在函数 MM 文件中,到第一个非注释行为止的注释行是帮助文本。当文件中,到第一个非注释行为止的注释行是帮助文本。当需要帮助时,返回该文本。需要帮助时,返回该文本。

4. 4. 第一行帮助行,名为第一行帮助行,名为 H1 H1 行,是由行,是由 lookfor lookfor 命令搜索的行。命令搜索的行。5. 5. 函数可以有零个或更多个输入参量。函数可以有零个或更多个输出函数可以有零个或更多个输入参量。函数可以有零个或更多个输出

参量。参量。

Page 62: 1 . MATLAB 概述

6. 6. 函数可以按少于函数函数可以按少于函数 MM 文件中所规定的输入和输出变量进行调用,文件中所规定的输入和输出变量进行调用,但不能用多于函数但不能用多于函数 MM 文件中所规定的输入和输出变量数目。如果输入和输文件中所规定的输入和输出变量数目。如果输入和输出变量数目多于函数出变量数目多于函数 MM 文件中文件中 function function 语句一开始所规定的数目,则调用语句一开始所规定的数目,则调用时自动返回一个错误。时自动返回一个错误。

7. 7. 当函数有一个以上输出变量时,输出变量包含在括号内。例如,当函数有一个以上输出变量时,输出变量包含在括号内。例如, [V,[V,D] = eig(A)D] = eig(A) 。不要把这个句法与等号右边的。不要把这个句法与等号右边的 [V,D] [V,D] 相混淆。右边的相混淆。右边的 [V,D] [V,D] 是由数组是由数组 VV 和和 D D 所组成。所组成。

8. 8. 当调用一个函数时,所用的输入和输出的参量的数目,在函数内是当调用一个函数时,所用的输入和输出的参量的数目,在函数内是规定好的。函数工作空间变量规定好的。函数工作空间变量 nargin nargin 包含输入参量个数;函数工作空间变包含输入参量个数;函数工作空间变量量 nargout nargout 包含输出参量个数。事实上,这些变量常用来设置缺省输入变包含输出参量个数。事实上,这些变量常用来设置缺省输入变量,并决定用户所希望的输出变量。量,并决定用户所希望的输出变量。

例如,考虑例如,考虑 MATLABMATLAB 函数函数 linspace linspace ::function y = linspace(d1, d2, n)function y = linspace(d1, d2, n) if nargin == 2if nargin == 2 n = 100;n = 100;endendy = [d1+(0:n-2)*(d2-d1)/(n-1) d2] ;y = [d1+(0:n-2)*(d2-d1)/(n-1) d2] ;

Page 63: 1 . MATLAB 概述

9. 9. 当一个函数说明一个或多个输出变量,但没有要求输出时,就简单当一个函数说明一个或多个输出变量,但没有要求输出时,就简单地不给输出变量赋任何值。地不给输出变量赋任何值。 MATLABMATLAB 函数函数 toc toc 阐明了这个属性。阐明了这个属性。

function t = tocfunction t = toc%TOC%TOC Read the stopwatch timer.Read the stopwatch timer.%TOC, by itself, prints the elapsed time since TIC was used.%TOC, by itself, prints the elapsed time since TIC was used.%t = TOC; saves the elapsed time in t, instead of printing it out.%t = TOC; saves the elapsed time in t, instead of printing it out. if nargout < 1if nargout < 1 elapsed_time = etime(clock, TICTOC)elapsed_time = etime(clock, TICTOC) elseelse t = etime(clock, TICTOC);t = etime(clock, TICTOC); endend如果用户用不以输出参量调用如果用户用不以输出参量调用 toc toc ,例如, ,例如, » toc» toc ,就不指定输出变,就不指定输出变

量量 t t 的值,函数在命令窗口显示函数工作空间变量的值,函数在命令窗口显示函数工作空间变量 elapsed_time elapsed_time ,但在,但在MATLABMATLAB 工作空间里不创建变量。相反,如果工作空间里不创建变量。相反,如果 toc toc 是以 是以 » out=toc » out=toc 调用,调用,则按变量则按变量 outout 将消逝的时间返回到命令窗口。将消逝的时间返回到命令窗口。

Page 64: 1 . MATLAB 概述

10. 10. 函数有它们自己的专用工作空间,它与函数有它们自己的专用工作空间,它与 MATLABMATLAB 的工作空间分开。的工作空间分开。函数内变量与函数内变量与 MATLABMATLAB 工作空间之间唯一的联系是函数的输入和输出变量。工作空间之间唯一的联系是函数的输入和输出变量。如果函数任一输入变量值发生变化,其变化仅在函数内出现,不影响如果函数任一输入变量值发生变化,其变化仅在函数内出现,不影响 MATLMATLABAB工作空间的变量。函数内所创建的变量只驻留在函数的工作空间,而且工作空间的变量。函数内所创建的变量只驻留在函数的工作空间,而且只在函数执行期间临时存在,以后就消失。因此,从一个调用到下一个调用,只在函数执行期间临时存在,以后就消失。因此,从一个调用到下一个调用,在函数工作空间变量存储信息是不可能的。在函数工作空间变量存储信息是不可能的。 (( 使用全局变量就提供这个特使用全局变量就提供这个特征。征。 ))

11. 11. 如果一个预定的变量,例如,如果一个预定的变量,例如, pipi , 在, 在 MATLABMATLAB 工作空间重新定义,工作空间重新定义,它不会延伸到函数的工作空间。逆向有同样的属性,即函数内的重新定义变它不会延伸到函数的工作空间。逆向有同样的属性,即函数内的重新定义变量不会延伸到量不会延伸到 MATLABMATLAB 的工作空间中。的工作空间中。

12. 12. 当调用一个函数时,输入变量不会拷贝到函数的工作空间,但使它当调用一个函数时,输入变量不会拷贝到函数的工作空间,但使它们的值在函数内可读。然而,改变输入变量内的任何值,那么数组就拷贝到们的值在函数内可读。然而,改变输入变量内的任何值,那么数组就拷贝到函数工作空间。进而,按缺省,如果输出变量与输入变量相同,例如,函数函数工作空间。进而,按缺省,如果输出变量与输入变量相同,例如,函数x=fun(x, y, z) x=fun(x, y, z) 中的中的 x x ,那么就将它拷贝到函数的工作空间。因此,为了节约,那么就将它拷贝到函数的工作空间。因此,为了节约存储和增加速度,最好是从大数组中抽取元素,然后对它们作修正,而不是存储和增加速度,最好是从大数组中抽取元素,然后对它们作修正,而不是使整个数组拷贝到函数的工作空间。使整个数组拷贝到函数的工作空间。

Page 65: 1 . MATLAB 概述

13.13. 如果变量说明是全局的如果变量说明是全局的 ,, 函数可以与其它函数、函数可以与其它函数、 MATLABMATLAB工作空间和递归调用工作空间和递归调用本身共享变量。为了在函数内或本身共享变量。为了在函数内或 MATLABMATLAB工作空间中访问全局变量,在每一个所希工作空间中访问全局变量,在每一个所希望的工作空间,变量必须说明是全局的。全局变量使用的例子可以在望的工作空间,变量必须说明是全局的。全局变量使用的例子可以在 MATLABMATLAB 函数函数tictic 和和 toctoc 中看到,它们合在一起工作如一个跑表。中看到,它们合在一起工作如一个跑表。

function ticfunction ticglobal TICTOCglobal TICTOCTICTOC = clock;TICTOC = clock;

function t = tocfunction t = tocglobal TICTOCglobal TICTOCif nargout < 1if nargout < 1 elapsed_time = etime(clock,TICTOC)elapsed_time = etime(clock,TICTOC)elseelse t = etime(clock,TICTOC);t = etime(clock,TICTOC);endend

在函数在函数 tictic 中,变量中,变量 TICTOCTICTOC 说明为全局的,因此它的值由调用函数说明为全局的,因此它的值由调用函数 clockclock 来设来设定。以后在函数定。以后在函数 toc toc 中,变量中,变量 TICTOCTICTOC 也说明为全局的,让也说明为全局的,让 toctoc 访问存储在访问存储在 TICTTICTOCOC 中的值。利用这个值,中的值。利用这个值, toctoc 计算自执行函数计算自执行函数 tictic 以来消逝的时间。值得注意的是,以来消逝的时间。值得注意的是,变量变量 TICTOCTICTOC存在于存在于 tictic 和和 toctoc 的工作空间,而不在的工作空间,而不在 MATLABMATLAB工作空间。 工作空间。

Page 66: 1 . MATLAB 概述

14. 14. 实际编程中,无论什么时候应尽量避免使用全局变量。要是用了实际编程中,无论什么时候应尽量避免使用全局变量。要是用了全局变量,建议全局变量名要长,它包含所有的大写字母,并有选择地以首全局变量,建议全局变量名要长,它包含所有的大写字母,并有选择地以首次出现的次出现的 MM 文件的名字开头。如果遵循建议,则在全局变量之间不必要的文件的名字开头。如果遵循建议,则在全局变量之间不必要的互作用减至最小。互作用减至最小。

15. 15. MATLAB MATLAB 以搜寻脚本文件的同样方式搜寻函数以搜寻脚本文件的同样方式搜寻函数 MM 文件。例如,输文件。例如,输入入 » cow » cow ,, MATLABMATLAB首先认为首先认为 cowcow 是一个变量。如果它不是,那么是一个变量。如果它不是,那么 MATMATLABLAB认为它是一个内置函数。如果还不是,认为它是一个内置函数。如果还不是, MATLABMATLAB检查当前检查当前 cow.mcow.m 的目的目录或文件夹。如果它不存在,录或文件夹。如果它不存在, MATLABMATLAB 就检查就检查 cow.mcow.m 在在 MATLABMATLAB 搜寻路搜寻路径上的所有目录或文件夹。径上的所有目录或文件夹。

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

Page 67: 1 . MATLAB 概述

17. 17. 函数可以递归调用。即函数可以递归调用。即 MM 文件函数能调用它们本身。文件函数能调用它们本身。function iforgot(n)function iforgot(n)if nargin==0,n=20;endif nargin==0,n=20;endif n>1if n>1 disp(' I will remember to do my homework. ')disp(' I will remember to do my homework. ') iforgot(n-1)iforgot(n-1)elseelse disp(' Maybe NOT! ')disp(' Maybe NOT! ')endend

递归调用函数功能在许多应用场合是有用的。在编制要递归调用的函递归调用函数功能在许多应用场合是有用的。在编制要递归调用的函数时,必须确保会终止,否则数时,必须确保会终止,否则 MATLABMATLAB 会陷入死循环。最后,在一个递归会陷入死循环。最后,在一个递归函数内,如果变量说明是全局的,则该全局变量对以后所有函数调用是可函数内,如果变量说明是全局的,则该全局变量对以后所有函数调用是可用的。在这个意义下,全局变量变成静态的,并在函数调用之间不会消失。用的。在这个意义下,全局变量变成静态的,并在函数调用之间不会消失。

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

Page 68: 1 . MATLAB 概述

19. MATLAB19. MATLAB 函数函数 errorerror 在命令窗口显示一个字符串,放弃函数执行,在命令窗口显示一个字符串,放弃函数执行,把控制权返回给键盘。这个函数对提示函数使用不当很有用,如:把控制权返回给键盘。这个函数对提示函数使用不当很有用,如:

if length(val)>1if length(val)>1 error(' VAL must be a scalar. ')error(' VAL must be a scalar. ')endend

这里,如果变量这里,如果变量 valval 不是一个标量,不是一个标量, errorerror 显示消息字符串,把控制显示消息字符串,把控制权返回给命令窗口和键盘。权返回给命令窗口和键盘。

20. 20. 当一个函数的输入参量的个数超出了规定的范围,当一个函数的输入参量的个数超出了规定的范围, MATLABMATLAB 函数函数nargchknargchk 提供了统一的响应。函数提供了统一的响应。函数 nargchknargchk 给定为:给定为:

function msg = nargchk(low, high, number)function msg = nargchk(low, high, number)msg = [ ] ;msg = [ ] ;if (number < low)if (number < low)

msg = ' Not enough input arguments. ' ;msg = ' Not enough input arguments. ' ;elseif (number > high)elseif (number > high)

msg = ' Too many input arguments. ' ;msg = ' Too many input arguments. ' ;endend

Page 69: 1 . MATLAB 概述

下列的文件片段表明了在一个下列的文件片段表明了在一个 MM 文件函数内的典型用法:文件函数内的典型用法: error(nargchk(nargin, 2, 5))error(nargchk(nargin, 2, 5))如上所示,如果如上所示,如果 narginnargin 的值小于的值小于 22 ,函数,函数 errorerror 象前面描述的那样进象前面描述的那样进

行处理,行处理, nargchknargchk 返回字符串‘没有足够的输入参量。’。如果返回字符串‘没有足够的输入参量。’。如果 narginnargin的值大于的值大于 55 ,函数,函数 errorerror 执行处理,执行处理, nargchknargchk 返回字符串‘太多输入参返回字符串‘太多输入参量。’。如果量。’。如果 narginnargin 是在是在 22 和和 55 之间,函数之间,函数 errorerror 简单地将控制传递给下简单地将控制传递给下一个语句,一个语句, nargchknargchk 返回一个空字符串。也就是说,当它的输入参量为空,返回一个空字符串。也就是说,当它的输入参量为空,errorerror 函数什么也不做。函数什么也不做。