第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab...

46
1 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有 Matlab 1.0 for 386 DOS 版本,后来逐步发展.这里介绍 的版本是 Matlab 6.x for Windows.因为它使用方便,界面美观,我们选择它作为主要讲解 版本.Matlab 还有许多附加的部分,最常见的部分称为 Simulink,是一个用作系统仿真的 软件包,它可以让您定义各种部件,定义各自对某种信号的反应方式及与其它部件的连接方 式.最后选择输入信号,系统会仿真运行整个模拟系统,并给出统计数据. Simulink 有时是 作为 Matlab 的一部分提供的,称为 Matlab with Simulink 版本.Matlab 还有许多工具箱, 它们是根据各个特殊领域的需要,用 Matlab 自身的语言编写的程序集合,使用起来非常方 便.您可以视工作性质和需要购买相应的工具箱.常见的工具箱有: Signal Process 信号处理 System Identification 系统辨识 Optimization 优化 Neural Network 神经网络 Control System 自动控制 Spline 样条 Symbolic Math 符号代数 Image Process 图像处理 Nonlinear Control 非线性控制 Statistics 统计 二、Matlab 基本用法 Windows 中双击 Matlab 图标,会出现 Matlab 命令窗口(Command Window),在一 段提示信息后,出现系统提示符“>>”. Matlab 是一个交互系统,您可以在提示符后键入各 种命令,通过上下箭头可以调出以前打入的命令,用滚动条可以查看以前的命令及其输出信 息. 如果对一条命令的用法有疑问的话,可以用 Help 菜单中的相应选项查询有关信息,也 可以用 help 命令在命令行上查询,您可以试一下 helphelp help help eig(求特征值的函 数)命令. 下面我们先从输入简单的矩阵开始掌握 Matlab 的功能. 1. 输入简单的矩阵 输入一个小矩阵的最简单方法是用直接排列的形式.矩阵用方括号括起,元素之间用空 格或逗号分隔,矩阵行与行之间用分号分开.例如输入: A=[1 2 3 ; 4 5 6 ; 7 8 0] 系统会回答 A = 1 2 3 4 5 6 7 8 0 表示系统已经接收并处理了命令,在当前工作区内建立了矩阵 A大的矩阵可以分行输入,用回车键代替分号,如: A=[ 1 2 3 4 5 6 7 8 0 ] 结果和上式一样,也是

Transcript of 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab...

Page 1: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

1

第一章 Matlab 用法简介

第一节 Matlab 快速入门

一、Matlab 的安装 Matlab 有各种版本,早期有 Matlab 1.0 for 386 的 DOS 版本,后来逐步发展.这里介绍

的版本是 Matlab 6.x for Windows.因为它使用方便,界面美观,我们选择它作为主要讲解

版本.Matlab 还有许多附加的部分,最常见的部分称为 Simulink,是一个用作系统仿真的

软件包,它可以让您定义各种部件,定义各自对某种信号的反应方式及与其它部件的连接方

式.最后选择输入信号,系统会仿真运行整个模拟系统,并给出统计数据.Simulink 有时是

作为 Matlab 的一部分提供的,称为 Matlab with Simulink 版本.Matlab 还有许多工具箱,

它们是根据各个特殊领域的需要,用 Matlab 自身的语言编写的程序集合,使用起来非常方

便.您可以视工作性质和需要购买相应的工具箱.常见的工具箱有: Signal Process 信号处理 System Identification 系统辨识 Optimization 优化 Neural Network 神经网络 Control System 自动控制 Spline 样条 Symbolic Math 符号代数 Image Process 图像处理 Nonlinear Control 非线性控制 Statistics 统计

二、Matlab 基本用法 从 Windows 中双击 Matlab 图标,会出现 Matlab 命令窗口(Command Window),在一

段提示信息后,出现系统提示符“>>”.Matlab 是一个交互系统,您可以在提示符后键入各

种命令,通过上下箭头可以调出以前打入的命令,用滚动条可以查看以前的命令及其输出信

息. 如果对一条命令的用法有疑问的话,可以用 Help 菜单中的相应选项查询有关信息,也

可以用 help 命令在命令行上查询,您可以试一下 help、help help 和 help eig(求特征值的函

数)命令. 下面我们先从输入简单的矩阵开始掌握 Matlab 的功能. 1. 输入简单的矩阵 输入一个小矩阵的最简单方法是用直接排列的形式.矩阵用方括号括起,元素之间用空

格或逗号分隔,矩阵行与行之间用分号分开.例如输入: A=[1 2 3 ; 4 5 6 ; 7 8 0]

系统会回答 A =

1 2 3 4 5 6 7 8 0

表示系统已经接收并处理了命令,在当前工作区内建立了矩阵 A. 大的矩阵可以分行输入,用回车键代替分号,如:

A=[ 1 2 3 4 5 6 7 8 0 ]

结果和上式一样,也是

Page 2: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

2

A = 1 2 3 4 5 6 7 8 0

2. 矩阵元素 Matlab 的矩阵元素可以是任何数值表达式.如:

x=[ -1.3 sqrt(3) (1+2+3)*4/5] 结果:

x = -1.3000 1.7321 4.8000

在括号中加注下标,可取出单独的矩阵元素.如: x(5)=abs(x(1))

结果 x =

-1.3000 1.7321 4.8000 0 1.3000 注:结果中自动产生了向量的第 5 个元素,中间未定义的元素自动初始为零. 大的矩阵可把小的矩阵作为其元素来完成,如:

A=[A; [10 11 12]] 结果

A = 1 2 3 4 5 6 7 8 0 10 11 12

小矩阵可用“:”从大矩阵中抽取出来,如: A=A(1:3,:);

即从 A 中取前三行和所有的列,重新组成原来的 A. (详细介绍参见第二节的相关内容) 3. 语句和变量 Matlab 的表述语句、变量的类型说明由 Matlab 系统解释和判断.Matlab 语句通常形式

为: 变量=表达式 或者使用其简单形式为: 表达式 表达式由操作符或其它特殊字符、函数和变量名组成.表达式的结果为一个矩阵,显示

在屏幕上,同时保存在变量中以留用.如果变量名和“=”省略,则具有 ans 名(意思指回答)的变量将自动建立.例如:

键入 1900/81 结果为:

ans = 23.4568

需注意的问题有以下几点: 语句结束键入回车键,若语句的最后一个字符是分号,即“;”,则表明不输出当前

命令的结果. 如果表达式很长,一行放不下,可以键入“…”(三个点,但前面必须有个空格,

Page 3: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

3

目的是避免将形如“数 2 …”理解为“数 2.”与“..”的连接,从而导致错误),然

后回车. 变量和函数名由字母加数字组成,但最多不能超过 63 个字符,否则系统只承认前

63 个字符. Matlab 变量字母区分大小写,如 A 和 a 不是同一个变量,函数名一般使用小写字

母,如 inv(A)不能写成 INV(A),否则系统认为未定义函数. 4. who 和系统预定义变量 输入 who 命令可检查工作空间中建立的变量,键入:

who 系统输出为:

Your variables are: A ans x

这里表明三个变量已由前面的例子产生了. 但列表中列出的并不是系统全部的变量,系统还有以下内部变量: eps、pi、Inf、NaN 变量 eps 在决定诸如矩阵的奇异性时,可作为一个容许差,容许差的初值为 1.0 到 1.0

以后计算机所能表示的下一个最大浮点数,IEEE 在各种计算机、工作站和个人计算机上使

用这个算法.用户可将此值置为任何其它值(包括 0 值).Matlab 的内部函数 pinc 和 rank 以

eps 为缺省的容许差. 变量 pi 是π,它是用 imag(log(-1))建立的. Inf 表示无穷大.如果您想计算 1/0

S=1/0 结果会是

Warning:Divide by zero S=Inf

具有 IEEE 规则的机器,被零除后,并不引出出错条件或终止程序的运行,而产生一个

警告信息和一个特殊值在计算方程中列出来. 变量 NaN 表示它是个不定值.由 Inf/Inf 或 0/0 运算产生. 要了解当前变量的信息请键入 whos,屏幕将显示:

Name Size Bytes Class A 4x3 96 double array S 1x1 8 double array ans 1x1 8 double array x 1x5 40 double array Grand total is 19 elements using 152 bytes

从 Size 及 Bytes 项目可以看出,每一个矩阵实元素需 8 个字节的内存.4×3 的矩阵使用

96 个字节,全部变量的使用内存总数为 152 个字节.自由空间的大小决定了系统变量的多

少,如计算机上有虚拟内存的话,其可定义的变量个数会大大增加. 5. 数和算术表达式 Matlab 中数的表示方法和一般的编程语言没有区别.如: 3 -99 0.0001 9.63972 1.6021E-20 6.02252e23 在计算中使用 IEEE 浮点算法其舍入误差是 eps.浮点数表示范围是 10-308~10308. 数学运算符有:

Page 4: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

4

+ 加 - 减 * 乘 / 右除 \ 左除 ^ 幂

这里 1/4 和 4\1 有相同的值,都等于 0.25(注意比较:1\4=4).只有在矩阵的除法时左

除和右除才有区别. 6.复数与矩阵 在 Matlab 中复数可由下面语句给出:

Z=3+4i (注意: 在 4 与 i 之间不要留有任何空间!) 输入复数矩阵有两个方便的方法,如:

A=[1 2; 3 4] + i*[5 6; 7 8] 和 A=[1+5i 2+6i; 3+7i 4+8i] 两式具有相等的结果.但当复数作为矩阵的元素输入时,不要留有任何空间,如 1+5i,

如在“+”号左右留有空格,就会被认为是两个分开的数. 7. 输出格式 任何 Matlab 语句执行结果都可在屏幕上显示,同时赋给指定的变量,没有指定变量时

赋给 ans.数字显示格式可由 format 命令来控制(Windows 系统下的 Matlab 系统的数字显

示格式可以由 Option 菜单中的 Numerical Format 菜单改变).format 仅影响矩阵的显示,不

影响矩阵的计算与存贮.(Matlab 以双精度执行所有的运算) 首先,如果矩阵元素是整数则矩阵显示就没有小数,如 x=[-1 0 1],结果为: x= -1 0 1 如果矩阵元素不是整数,则输出形式有:(用命令:format 格式进行切换)

格式 中文解释 说明 format 短格式

(缺省格式) Default. Same as SHORT

format short 短格式 (缺省格式)

Scaled fixed point format with 5 digits (只显示五位十进制数)

format long 长格式 Scaled fixed point format with 15 digits format short e 短格式 e 方式 Floating point format with 5 digits format long e 长格式 e 方式 Floating point format with 15 digits format short g 短格式 g 方式 Best of fixed or floating point format with 5 digits format long g 长格式 g 方式 Best of fixed or floating point format with 15 digits format hex 16 进制格式 Hexadecimal format format + +格式 The symbols +, - and blank are printed

for positive, negative and zero elements. Imaginary parts are ignored

format bank 银行格式 Fixed format for dollars and cents format rat 有理数格式 Approximation by ratio of small integers format compact

压缩格式 Suppress extra line-feeds

format loose 自由格式 Puts the extra line-feeds back in

Page 5: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

5

例如: x=[4/3 1.2345e-6]

在不同的输出格式下的结果为: 短格式 1.3333 0.0000 短格式 e 方式 1.3333e+000 1.2345e-006 长格式 1.333333333333333 0.000001234500000 长格式 e 方式 1.333333333333333e-000 1.23450000000000e-006 有理数格式 4/3 1/810045 16 进制格式 3ff5555555555555 3eb4b6231abfd271 +格式 + + 对于短格式,如果矩阵的最大元素比数 999999999 大,或者比数 0.0001 小,则在打印时,

将加入一个普通的长度因数.如 y=1.e20*x,意为 x 被 1020乘,结果为: y=

1.0e+020* 1.3333 0.0000

“+”格式是显示大矩阵的一种紧凑方法,“+”,“-”和空格显示正数、负数和零元素. 最后 format compact 命令压缩显示的矩阵,以允许更多的信息显示在屏幕上. 8. Help 求助命令和联机帮助 Help 求助命令很有用,它对 Matlab 大部分命令提供了联机求助信息.您可以从 Help

菜单中选择相应的菜单,打开求助信息窗口查询某条命令,也可以直接用 help 命令. 键入 help

得到 help 列表文件,键入“help 指定项目”,如: 键入 help eig

则提供特征值函数的使用信息. 键入 help [

显示如何使用方括号等. 键入 help help

显示如何利用 help 本身的功能. 还有,键入 lookfor <关键字>:可以从 M 文件的 help 中查找有关的关键字. 9.退出和存入工作空间 退出 Matlab 可键入 quit 或 exit 或选择相应的菜单.中止 Matlab 运行会引起工作空间中

变量的丢失,因此在退出前,应键入 save 命令,保存工作空间中的变量以便以后使用. 键入 save

则将所有变量作为文件存入磁盘 Matlab.mat 中,下次 Matlab 启动时, 键入 load

将变量从 Matlab.mat 中重新调出. save 和 load 后边可以跟文件名或指定的变量名,如仅有 save 时,则只能存入 Matlab.mat

中.如 save temp 命令,则将当前系统中的变量存入 temp.mat 中去,命令格式为: save temp x 仅仅存入 x 变量. save temp X Y Z 则存入 X、Y、Z 变量. load temp 可重新从 temp.mat 文件中提出变量,load 也可读 ASCII 数据文件.详细语法

见联机帮助.

Page 6: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

6

练习题 1. 产生行向量 S =[1.0, 1.2, 1.4, …, 20],并计算 S * S' 与 S' * S,你有何“发现”?

2.设 A=1 23 4

;B=5 50 5

;求 C=A * B – B * A,你有何“发现”?

3.若设矩阵 A=1 23 4

;B=5 00 5

;求 C=A * B – B * A,你又有何“发现”?

4. 写出可以完成下列任务的 Matlab 命令(函数): (1)Matlab 中的圆周率 π 约等于多少? (2)Matlab 中的浮点运算相对精度是多少? (3)浮点数表示范围为:10-308~10308,但具体是多少? (4)Matlab 中的最大整数、最小整数分别是多少? (5)如何知道命令 realmax 的具体用法? (6)如何知道函数 max 的作用?并举例加以说明。 5. 回答以下问题: (1)Matlab 是什么含义? (2)Matlab 命令 who 与 whos 有什么区别? (3)如何使用 Matlab 命令补全功能? (4)Matlab 命令 clear、clc 与 home 有什么区别?

Page 7: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

7

第二节 Matlab 矩阵运算

Matlab 能处理数、向量和矩阵.但一个数事实上是一个 1×1 的矩阵,1 个 n 维向量也

不过是一个 1×n 或 n×1 的矩阵.从这个角度上来讲,Matlab 处理的所有的数据都是矩

阵.Matlab 的矩阵处理能力是非常灵活、强大的.以下我们将从矩阵的产生、基本运算、

矩阵函数等几个方面来说明. 一、向量及矩阵的生成 除了我们在上节介绍的直接列出矩阵元素的输入方法,矩阵还可以通过几种不同的方式

输入到 Matlab 中. 1.通过语句和函数产生 (1) 向量的产生 除了直接列出向量元素(即所谓的“穷举法”)外,最常用的用来产生相同增量的向量

的方法是利用“:”算符(即所谓的“描述法”).在 Matlab 中,它是一个很重要的字符.如: z=1:5

z = 1 2 3 4 5

即产生一个 1~5 的单位增量是 1 的行向量,此为默认情况. 用“:”号也可以产生单位增量不等于 1 的行向量,语法是把增量放在起始量和结尾量的

中间.如: x=0:pi/4:pi

即产生一个由 0~pi 的行向量,单位增量是 pi/4=3.1416/4=0.7854. x =

0 0.7854 1.5708 2.3562 3.1416 也可以产生单位增量为负数的行向量.如:

y=6:-1:1 y = 6 5 4 3 2 1 (2) 矩阵的产生 Matlab 提供了一批产生矩阵的函数:

zeros 产生一个零矩阵 diag 产生一个对角矩阵 ones 生成全 1 矩阵 tril 取一个矩阵的下三角 eye 生成单位矩阵 triu 取一个矩阵的上三角 magic 生成魔术方阵 pascal 生成 PASCAL 矩阵

例如: ones(3) ans =

1 1 1 1 1 1 1 1 1

eye(3) ans =

1 0 0 0 1 0

Page 8: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

8

0 0 1 除了以上产生标准矩阵的函数外,Matlab 还提供了产生随机(向量)矩阵的函数 rand

和 randn,及产生均匀级数的函数 linspace、产生对数级数的函数 logspace 和产生网格的函数

meshgrid 等等.详细使用请查阅随机文档. “ : ”冒号可以用来产生简易的表格,为了产生纵向表格形式,首先用冒号“ : ”产

生行向量,再进行转置,计算函数值的列,然后形成有二列的矩阵.例如命令: x=(0.0:0.2:1.2)'; y=exp(-x).*sin(x); [x y]

产生结果为: ans =

0 0 0.2000 0.1627 0.4000 0.2610 0.6000 0.3099 0.8000 0.3223 1.0000 0.3096 1.2000 0.2807

2. 通过后缀为.m 的命令文件产生 如有文件 data.m,其中包括正文:

A=[ 1 2 3 4 5 6 7 8 0]

则用 data 命令执行 data.m,可以产生名为 A 的矩阵. 二、矩阵操作 在 Matlab 中可以对矩阵进行任意操作,包括改变它的形式,取出子矩阵,扩充矩阵,

旋转矩阵等.其中最重要的操作符为“:”, 它的作用是取出选定的行与列. 例如:

A(:,:) 代表 A 的所有元素;试比较 A(:), 将 A 按列的方向拉成长长的 1 列(向量); A(:,J) 代表 A 的第 J 列; A(J:K) 代表 A(J), A(J+1), …, A(K),如同 A(:)的第 J 到第 K 个元素; A(:,J:K) 代表 A(:,J), A(:,J+1), …, A(:,K),如此类推.

对矩阵可以进行各种各样的旋转、变形、扩充: Matlab中有内部函数 fliplr ( Flip matrix in the left/right direction),它对矩阵进行左右旋转. 例 x = 1 2 3 fliplr(x)为 3 2 1

4 5 6 6 5 4 同样有 flipud: x = 1 4 flipud(x)为 3 6 2 5 2 5 3 6 1 4 矩阵的转置用符号“ ' ”表示: 如 A=[1 2 3; 4 5 6 ; 7 8 0] 那么:计算 B=A'

B =

Page 9: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

9

1 4 7 2 5 8 3 6 0

符号“ ' ”为矩阵的转置,如果 Z 为复矩阵,则 Z'为它的复数共轭转置,非共轭转置使

用 Z.' 或 conj(Z')求得. reshape 改变矩阵的形状,这是什么意思呢?可举一个例子来说明. A=[A;[10 11 12]] A =

1 2 3 4 5 6 7 8 0 10 11 12

则 reshape(A,2,6) ans =

1 7 2 8 3 0 4 10 5 11 6 12

可见,reshape 是将矩阵元素以列为单位进行重组,原来 4×3的矩阵变为了 2×6的矩阵.那

么以下的语句也不难理解了,它将矩阵 A 按列打开(size 函数返回矩阵 A 的行数与列数). reshape(A,1,size(A,1)*size(A,2)),它等价于 A(:)' .

还有函数 rot90,它可以将矩阵进行各种 90 度的旋转;tril 及 triu 取出矩阵的下三角及上

三角阵等.详细的用法可以在需要使用时查阅手册. 三、加和减 如矩阵 A 和 B 的维数相同,则 A+B 与 A-B 表示矩阵 A 与 B 的和与差.如果矩阵 A 和

B 的维数不匹配,Matlab 会给出相应的错误提示信息.如: A= B=

1 2 3 1 4 7 4 5 6 2 5 8 7 8 0 3 6 0

C =A+B 返回: C = 2 6 10 6 10 14 10 14 0

如果运算对象是个标量(即 1×1 矩阵),可和其它矩阵进行加减运算.例如: x= -1 y=x-1= -2

0 -1 2 1

四、矩阵乘法 Matlab 中的矩阵乘法有通常意义上的矩阵乘法,也有 Kronecker 乘法,以下分别介绍.

1. 矩阵的普通乘法 矩阵乘法用“ * ”符号表示,当 A 矩阵列数与 B 矩阵的行数相等时,二者可以进行乘

法运算,否则是错误的.计算方法和线性代数中所介绍的完全相同. 如:A=[1 2 ; 3 4]; B=[5 6 ; 7 8]; C=A*B, 结果为

Page 10: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

10

C=1 23 4

×5 67 8

=1 5 2 7 1 6 2 83 5 4 7 3 6 4 8× + × × + ×

× + × × + × =

19 2243 50

即 Matlab 返回: C = 19 22 43 50 如果 A 或 B 是标量,则 A*B 返回标量 A(或 B)乘上矩阵 B(或 A)的每一个元素所

得的矩阵. 2. 矩阵的 Kronecker 乘法 对 n×m 阶矩阵 A 和 p×q 阶矩阵 B,A 和 B 的 Kronecher 乘法运算可定义为:

11 12 1

21 22 2

1 2

...

...

...

m

m

n n nm

a B a B a Ba B a B a B

C A B

a B a B a B

= ⊗ =

由上面的式子可以看出,Kronecker 乘积 A⊗B 表示矩阵 A 的所有元素与 B 之间的乘积

组合而成的较大的矩阵,B⊗A 则完全类似.A⊗B 和 B⊗A 均为 np×mq 矩阵,但一般情

况下 A⊗B≠ B⊗A.和普通矩阵的乘法不同,Kronecker 乘法并不要求两个被乘矩阵满足任

何维数匹配方面的要求.Kronecker 乘法的 Matlab 命令为 C=kron(A,B),例如给定两个矩阵

A 和 B:

A=1 23 4

B=1 3 22 4 6

则由以下命令可以求出 A 和 B 的 Kronecker 乘积 C: A=[1 2; 3 4]; B=[1 3 2; 2 4 6]; C=kron(A,B)

C = 1 3 2 2 6 4 2 4 6 4 8 12 3 9 6 4 12 8 6 12 18 8 16 24

作为比较,可以计算 B 和 A 的 Kronecker 乘积 D,可以看出 C、D 是不同的: A=[1 2; 3 4]; B=[1 3 2; 2 4 6]; D=kron(B,A)

D = 1 2 3 6 2 4 3 4 9 12 6 8 2 4 4 8 6 12 6 8 12 16 18 24

五、矩阵除法 在 Matlab 中有两种矩阵除法符号:“\”即左除和“/”即右除.如果 A 矩阵是非奇异

方阵,则 A\B 是 A 的逆矩阵乘 B,即 inv(A)*B;而 B/A 是 B 乘 A 的逆矩阵,即 B*inv(A).具体计算时可不用逆矩阵而直接计算.

通常: x=A\B 就是 A*x=B 的解;

Page 11: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

11

x=B/A 就是 x*A=B 的解. 当 B 与 A 矩阵行数相等可进行左除.如果 A 是方阵,用高斯消元法分解因数.解方程:

A*x(:, j)=B(:, j),式中的(:, j)表示 B 矩阵的第 j 列,返回的结果 x 具有与 B 矩阵相同的阶数,

如果 A 是奇异矩阵将给出警告信息. 如果 A 矩阵不是方阵,可由以列为基准的 Householder 正交分解法分解,这种分解法可

以解决在最小二乘法中的欠定方程或超定方程,结果是 m×n 的 x 矩阵.m 是 A 矩阵的列数,

n 是 B 矩阵的列数.每个矩阵的列向量最多有 k 个非零元素,k 是 A 的有效秩. 右除 B/A 可由 B/A=(A'\B')'左除来实现. 六、矩阵乘方 A^P 意思是 A 的 P 次方.如果 A 是一个方阵,P 是一个大于 1 的整数,则 A^P 表示 A

的 P 次幂,即 A 自乘 P 次.如果 P 不是整数,计算涉及到特征值和特征向量的问题,如已

经求得:[V,D]=eig(A),则: A^P=V*D.^P/V(注:这里的.^表示数组乘方,或点乘方,参见后面的有关介绍) 如果 B 是方阵, a 是标量,a^B 就是一个按特征值与特征向量的升幂排列的 B 次方程

阵. 如果 a 和 B 都是矩阵,则 a^B 是错误的. 七、矩阵的超越函数 在 Matlab 中解释 exp(A)和 sqrt(A)时曾涉及到级数运算,此运算定义在 A 的单个元素

上. Matlab 可以计算矩阵的超越函数,如矩阵指数、矩阵对数等. 一个超越函数可以作为矩阵函数来解释,例如将“m”加在函数名的后边而成 expm(A)

和 sqrtm(A),当 Matlab 运行时,有下列三种函数定义: expm 矩阵指数 logm 矩阵对数 sqrtm 矩阵开方

所列各项可以加在多种 m 文件中或使用 funm.请见应用库中 sqrtm.m,1ogm.m,funm.m文件和命令手册.

八、数组运算 数组运算由线性代数的矩阵运算符“*”、“/”、“\”、“^”前加一点来表示,即为“.*”、

“./”、“.\”、“.^”.注意没有“.+”、“.-”运算. 1. 数组的加和减 对于数组的加和减运算与矩阵运算相同,所以“+”、“-”既可被矩阵接受又可被数组接

受. 2. 数组的乘和除 数组的乘用符号.*表示,如果 A 与 B 矩阵具有相同阶数,则 A.*B 表示 A 和 B 单个元素

之间的对应相乘.例如 x=[1 2 3]; y=[ 4 5 6]; 计算 z=x.*y 结果 z=4 10 18 数组的左除(.\)与数组的右除(./),由读者自行举例加以体会. 3. 数组乘方 数组乘方用符号.^表示. 例如:键入:

x=[ 1 2 3] y=[ 4 5 6]

则 z=x.^y=[1^4 2^5 3^6]=[1 32 729] (1) 如指数是个标量,例如 x.^2,x 同上,则:

Page 12: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

12

z=x.^2=[1^2 2^2 3^2]=[ 1 4 9] (2) 如底是标量,例如 2 .^[x y] ,x、y 同上,则:

z=2 .^[x y]=[2^1 2^2 2^3 2^4 2^5 2^6]=[2 4 8 16 32 64] 从此例可以看出 Matlab 算法的微妙特性,虽然看上去与其它乘方没什么不同,但在 2

和“.”之间的空格很重要,如果不这样做,解释程序会把“.”看成是 2 的小数点. Matlab看到符号“^”时,就会当做矩阵的幂来运算,这种情况就会出错,因为指数矩阵不是方阵.

九、矩阵函数 Matlab 的数学能力大部分是从它的矩阵函数派生出来的,其中一部分装入 Matlab 本身

处理中,它从外部的 Matlab 建立的 M 文件库中得到,还有一些由个别的用户为其自己的特

殊的用途加进去的.其它功能函数在求助程序或命令手册中都可找到.手册中备有为 Matlab提供数学基础的 LINPACK 和 EISPACK 软件包,提供了下面四种情况的分解函数或变换函

数: (1)三角分解;(2)正交变换;(3) 特征值变换;(4)奇异值分解. 1. 三角分解 最基本的分解为“LU”分解,矩阵分解为两个基本三角矩阵形成的方阵,三角矩阵有上

三角矩阵和下三角矩阵.计算算法用高斯变量消去法. 从 lu 函数中可以得到分解出的上三角与下三角矩阵,函数 inv 得到矩阵的逆矩阵,det

得到矩阵的行列式.解线性方程组的结果由方阵的“\”和“/”矩阵除法来得到. 例如: A=[ 1 2 3

4 5 6 7 8 0]

LU 分解,用 Matlab 的多重赋值语句 [L,U]=lu(A)

得出 L =

0.1429 1.0000 0 0.5714 0.5000 1.0000 1.0000 0 0

U = 7.0000 8.0000 0

0 0.8571 3.0000 0 0 4.5000

注:L 是下三角矩阵的置换,U 是上三角矩阵的正交变换,分解作如下运算,检测计算

结果只需计算 L*U 即可. 求逆由下式给出: x=inv(A)

x = -1.7778 0.8889 -0.1111 1.5556 -0.7778 0.2222 -0.1111 0.2222 -0.1111

从 LU 分解得到的行列式的值是精确的,d=det(U)*det(L)的值可由下式给出: d=det(A) d =

27

Page 13: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

13

直接由三角分解计算行列式:d=det(L)*det(U) d =

27.0000 为什么两种 d 的显示格式不一样呢? 当 Matlab 做 det(A)运算时,所有 A 的元素都是整

数,所以结果为整数.但是用 LU 分解计算 d 时,L、U 的元素是实数,所以 Matlab 产生的

d 也是实数. 例如:线性联立方程取 b=[ 1 3 5] 解 Ax=b 方程,用 Matlab 矩阵除得到

x=A\b 结果 x=

0.3333 0.3333 0.0000

由于 A=L*U,所以 x 也可以有以下两个式子计算:y=L\b,x=U\y.得到相同的 x 值,

中间值 y 为: y =

5.0000 0.2857 0.0000

Matlab 中与此相关的函数还有 rcond、chol 和 rref.其基本算法与 LU 分解密切相关.chol函数对正定矩阵进行 Cholesky 分解,产生一个上三角矩阵,以使 R'*R=X.rref 用具有部分

主元的高斯-约当消去法产生矩阵 A 的化简梯形形式.虽然计算量很少,但它是很有趣的

理论线性代数.为了教学的要求,也包括在 Matlab 中. 2. 正交变换 “QR”分解用于矩阵的正交-三角分解.它将矩阵分解为实正交矩阵或复酉矩阵与上

三角矩阵的积,对方阵和长方阵都很有用. 例如 A=[ 1 2 3

4 5 6 7 8 9 10 11 12]

是一个降秩矩阵,中间列是其它二列的平均,我们对它进行 QR 分解: [Q,R]=qr(A) Q =

-0.0776 -0.8331 0.5444 0.0605 -0.3105 -0.4512 -0.7709 0.3251 -0.5433 -0.0694 -0.0913 -0.8317 -0.7762 0.3124 0.3178 0.4461

R = -12.8841 -14.5916 -16.2992

0 -1.0413 -2.0826 0 0 0.0000 0 0 0

Page 14: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

14

可以验证 Q*R 就是原来的 A 矩阵.由 R 的下三角都给出 0,并且 R(3,3)=0.0000,说明

矩阵 R 与原来矩阵 A 都不是满秩的. 下面尝试利用 QR 分解来求超定和降秩的线性方程组的解. 例如:

b=[ 1 3 5 7]

讨论线性方程组 Ax=b,我们可以知道方程组是超定的,采用最小二乘法的最好结果是

计算 x=A\b. 结果为:

Warning: Rank deficient, rank = 2 tol = 1.4594e-014 x = 0.5000 0 0.1667

我们得到了缺秩的警告.用 QR 分解法计算此方程组分二个步骤: y=Q'*b x=R\y

求出的 y 值为 y =

-9.1586 -0.3471 0.0000 0.0000

x 的结果为 Warning: Rank deficient, rank = 2 tol = 1.4594e-014 x = 0.5000 0 0.1667

用 A*x 来验证计算结果,我们会发现在允许的误差范围内结果等于 b.这告诉我们虽然

联立方程 Ax=b 是超定和降秩的,但两种求解方法的结果是一致的.显然 x 向量的解有无穷

多个,而“QR”分解仅仅找出了其中之一. 3. 奇异值分解 在 Matlab 中三重赋值语句

[U,S,V]=svd(A) 在奇异值分解中产生三个因数:

A=U*S*V ' U 矩阵和 V 矩阵是正交矩阵,S 矩阵是对角矩阵,svd(A)函数恰好返回 S 的对角元素,

而且就是 A 的奇异值(其定义为:矩阵 A'*A 的特征值的算术平方根).注意到 A 矩阵可以

不是方的矩阵. 奇异值分解可被其它几种函数使用,包括广义逆矩阵 pinv(A)、秩 rank(A)、欧几里德矩

阵范数 norm(A,2)和条件数 cond(A).

Page 15: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

15

4. 特征值分解 如果 A 是 n×n 矩阵,若λ满足 Ax=λx,则称λ为 A 的特征值,x 为相应的特征向量. 函数 eig(A)返回特征值列向量,如果 A 是实对称的,特征值为实数.特征值也可能为复

数,例如: A=[ 0 1

-1 0] eig(A) 产生结果 ans =

0 + 1.0000i 0 - 1.0000i

如果还要求求出特征向量,则可以用 eig(A)函数的第二个返回值得到: [x,D]=eig(A)

D 的对角元素是特征值.x 的列是相应的特征向量,以使 A*x=x*D. 计算特征值的中间结果有两种形式: Hessenberg 形式为 hess(A),Schur 形式为 schur(A). schur 形式用来计算矩阵的超越函数,诸如 sqrtm(A)和 logm(A). 如果 A 和 B 是方阵,函数 eig(A,B)返回一个包含一般特征值的向量来解方程

Ax=λBx 双赋值获得特征向量

[X,D]=eig(A,B) 产生特征值为对角矩阵 D.满秩矩阵 X 的列相应于特征向量,使 A*X=B*X*D,中间结

果由 qz(A,B)提供. 5. 秩 Matlab 计算矩阵 A 的秩的函数为 rank(A),与秩的计算相关的函数还有:rref(A)、orth(A)、

null(A)和广义逆矩阵 pinv(A)等. 利用 rref(A),A 的秩为非 0 行的个数.rref 方法是几个定秩算法中最快的一个,但结果

上并不可靠和完善.pinv(A)是基于奇异值的算法.该算法消耗时间多,但比较可靠.其它

函数的详细用法可利用 Help 求助.

练习题 1.如何用命令方式建立如下的矩阵?

(1)

10 10

2004 0 00 2004 0

0 0 2004×

; (2)

10 10

0 10 1010 0 10

10 10 0×

(3)

10 10

2004 1 11 2004 1

1 1 2004×

; (4)

10 10

10 10 1010 10 10

10 10 10×

− − − − − −

Page 16: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

16

(5)

10 0 01 20 0

1 1 100

(6)

1 1 12 3 111 1 13 4 12

1 1 111 12 20

(7)

2004 20 0 0 00 2004 30 0 00 0 2004 40 00 0 0 2004 500 0 0 0 2004

(8)

10 1 120 20 1

100 100 100

2. 按顺序进行如下的操作: (1)试分别生成 5 阶的单位阵、8 阶均匀分布的随机矩阵及其下三角矩阵; (2)生成列向量 x=[1, 3, 5, 7, 9, … , 99]; (3)生成以 x 的前 5 个元素为对角线的矩阵 A; (4)生成一个与 A 同阶的正态分布的随机矩阵 B; (5)计算 A 的转置 与 B 的 kronecker 乘积矩阵 C; (6)生成由 B 与其同阶魔方矩阵点乘得到的矩阵 D; (7)生成由 D 的第 2、4、5 行和第 4、1 列组成的子矩阵 E; (8)求出矩阵 E 中绝对值最大的元素的绝对值. 3.按顺序进行如下的操作: (1)产生一个 5 阶魔术方阵 A;并计算 A'与 A-1(即 inv(A)); (2)求 A 的特征值; (3)计算 A 的各列的总和与平均值; (4)计算 A 的各行的总和与平均值; (5)若 b=[1 2 3 4 5] ',求方程组 Ax=b 的解; (6)验证你的结论的正确性.

第三节 Matlab 绘图功能

一、二维作图 绘图命令 plot 绘制 x-y 坐标图;loglog 命令绘制对数坐标图;semilogx 和 semilogy 命令

绘制半对数坐标图;polor 命令绘制极坐标图. 1. 基本形式 如果 y 是一个向量,那么 plot(y)绘制一个 y 中元素的线性图.假设我们希望画出 y=[0., 0.48, 0.84, 1., 0.91, 6.14 ]

则用命令:plot(y) 它相当于命令:plot(x, y),其中 x=[1,2,…,n]或 x=[1;2;…;n],即向量 y 的下标编号, n 为

向量 y 的长度

Page 17: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

17

Matlab 会产生一个图形窗口,显示如图 1.1 所示,请注意:坐标 x 和 y 是由计算机自

动绘出的.

1 2 3 4 5 60

1

2

3

4

5

6

7

图 1.1 plot([0.,0.48,0.84,1.,0.91,6.14])

上面的图形没有加上 x 轴和 y 轴的标注,也没有标题.用 xlabel,ylabel,title 命令可以

加上. 如果x,y是同样长度的向量,plot(x,y)命令可画出相应的x元素与y元素的x-y坐标图.例:

x=0:0.05:4*pi; y=sin(x); plot(x,y) grid on, title(' y=sin( x ) 曲线图' ) xlabel(' x = 0 : 0.05 : 4Pi ')

结果见图 1.2.

0 2 4 6 8 10 12 14-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1 y=sin( x ) 曲线图

x = 0 : 0.05 : 4Pi

图 1.2 sin( )y x= 的图形

表 1.1 Matlab 图形命令

title 图形标题 xlabel x 坐标轴标注 ylabel y 坐标轴标注 text 标注数据点 grid 给图形加上网格 hold 保持图形窗口的图形

2. 多重线 在一个单线图上,绘制多重线有三种办法. 第一种方法是利用 plot 的多变量方式绘制:

Page 18: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

18

plot(x1,y1,x2,y2,...,xn,yn) x1,y1,x2,y2,...,xn,yn 是成对的向量,每一对 x, y 在图上产生如上方式的单线.多变量方

式绘图是允许不同长度的向量显示在同一图形上. 第二种方法也是利用 plot 绘制,但加上 hold on/off 命令的配合:

plot(x1,y1);hold on plot(x2,y2);hold off

第三种方法还是利用 plot 绘制,但代入矩阵: 如果 plot 用于两个变量 plot(x,y),并且 x,y 是矩阵,则有以下情况: (1)如果 y 是矩阵,x 是向量,plot(x,y)用不同的画线形式绘出 y 的行或列及相应的 x

向量,y 的行或列的方向与 x 向量元素的值选择是相同的. (2)如果 x 是矩阵,y 是向量,则除了 x 向量的线族及相应的 y 向量外,以上的规则也

适用. (3)如果 x,y 是同样大小的矩阵,plot(x,y)绘制 x 的列及 y 相应的列. 还有其它一些情况,请参见 Matlab 的帮助系统. 3. 线型和颜色的控制 如果不指定划线方式和颜色,Matlab 会自动为您选择点的表示方式及颜色.您也可以

用不同的符号指定不同的曲线绘制方式.例如: plot(x,y,'*') 用'*'作为点绘制的图形. plot(x1,y1,':',x2,y2,'+') 用':'画第一条线,用'+'画第二条线. 线型、点标记和颜色的取值有以下几种:

表 1.2 线型和颜色控制符 线型 点标记 颜色

- 实线 . 点 y 黄色 : 虚线 o 小圆圈 m 棕色 -. 点划线 x 叉子符 c 青色 -- 间断线 + 加号 r 红色 空白 不画线 * 星号 g 绿色 s 方格 b 蓝色 d 菱形 w 白色 ^ 朝上三角 k 黑色 v 朝下三角 > 朝右三角 < 朝左三角 p 五角星 h 六角星

如果你的计算机系统不支持彩色显示,Matlab 将把颜色符号解释为线型符号,用不同

的线型表示不同的颜色.颜色与线型也可以一起给出,即同时指定曲线的颜色和线型(图

1.3). 例如:t=-3.14:0.2:3.14;x=sin(t); y=cos(t);plot(t,x, '+r',t,y, '-b')

Page 19: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

19

-4 -3 -2 -1 0 1 2 3 4-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

图 1.3 不同线型、颜色的 sin,cos 图形

4. 对数图、极坐标图及条形图 loglog、semilogx、semilogy 和 polar 等的用法和 plot 相似.这些命令允许数据在不同的

graph paper 上绘制,例如不同的坐标系统.先介绍的 fplot 是扩展来的可用于符号作图的函

数. fplot(fname,lims) 绘制 fname 指定的函数的图形. polar( theta, rho) 使用相角 theta 为极坐标形式绘图,相应半径为 rho,其次可使用

grid 命令画出极坐标网格. loglog 用 log10-log10 标度绘图. semilogx 用半对数坐标绘图,x 轴是 log10,y 是线性的. semilogy 用半对数坐标绘图,y 轴是 log10,x 是线性的. bar(x) 显示 x 向量元素的条形图,bar 不接受多变量. hist 绘制统计频率直方图. histfit(data,nbins) 绘制统计直方图与其正态分布拟合曲线. fplot 函数的绘制区域为 lims=[xmin,xmax],也可以用 lims=[xmin,xmax,ymin,ymax]指定 y

轴的区域.函数表达式可以是一个函数名,如 sin,tan 等;也可以是带上参数 x 的函数表达

式,如 sin(x),diric(x,10);也可以是一个用方括号括起的函数组,如[sin, cos]. 例 1:fplot('sin',[0 4*pi]) 例 2:fplot('sin(1 ./ x)', [0.01 0.1]) 例 3:fplot('abs(exp(-j*x*(0:9))*ones(10,1))',[0 2*pi],'-o') 例 4:fplot('[sin(x), cos(x) , tan(x)]',[-2*pi 2*pi -2*pi 2*pi]) %%(图 1.4)

-6 -4 -2 0 2 4 6-6

-4

-2

0

2

4

6

10-4 10-2 100 102-10

0

10

20

30

图 1.4 sin,cos,tan 函数图形 图 1.5 半对数图

下面介绍的是其它几个作图函数的应用. 例 5:半对数坐标绘图

t=0.001:0.002:20; y=5 + log(t) + t;

Page 20: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

20

semilogx(t,y, 'b') hold on semilogx(t,t+5, 'r') %% (图 1.5)

例 6:极坐标绘图 t=0:0.01:2*pi; polar(t,sin(6*t)) %% (图 1.6)

图 1.6 极坐标绘图 图 1.7 正态分布的统计直方图与其正态分布拟合曲线

例 7:正态分布图 我们可以用命令 normrnd 生成符合正态分布的随机数. normrnd(u,v,m,n) 其中,u 表示生成随机数的期望,v 代表随机数的方差. 运行: a=normrnd(10,2,10000,1); histfit(a) %% (图 1.7)

我们可以得到正态分布的统计直方图与其正态分布拟合曲线. 例 8:比较正态分布(图 1.8(a))与平均分布(图 1.8(b))的分布图:

yn=randn(30000,1); %% 正态分布 x=min(yn) : 0.2 : max(yn); subplot(121) hist(yn, x) yu=rand(30000,1); %% 平均分布 subplot(122) hist(yu, 25)

(a) (b)

图 1.8 正态分布与平均分布的分布图

Page 21: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

21

5. 子图 在绘图过程中,经常要把几个图形在同一个图形窗口中表现出来,而不是简单地叠加(例

如上面的例 8).这就用到函数 subplot.其调用格式如下: subplot(m,n,p) subplot 函数把一个图形窗口分割成 m×n 个子区域,用户可以通过参数 p 调用个各子绘

图区域进行操作.子绘图区域的编号为按行从左至右编号. 例 9:绘制子图

x=0:0.1*pi:2*pi; subplot(2,2,1) plot(x,sin(x),'-*'); title('sin(x)'); subplot(2,2,2) plot(x,cos(x),'--o'); title('cos(x)'); subplot(2,2,3) plot(x,sin(2*x),'-.*'); title('sin(2x)'); subplot(2,2,4); plot(x,cos(3*x),':d') title('cos(3x)') 得到图形见图 1.9:

0 2 4 6 8-1

-0.5

0

0.5

1sin(x)

0 2 4 6 8-1

-0.5

0

0.5

1cos(x)

0 2 4 6 8-1

-0.5

0

0.5

1sin(2x)

0 2 4 6 8-1

-0.5

0

0.5

1cos(3x)

图 1.9 子图

6. 填充图 利用二维绘图函数 patch,我们可绘制填充图.绘制填充图的另一个函数为 fill. 下面的例子绘出了函数 humps(一个 Matlab 演示函数)在指定区域内的函数图形.

Page 22: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

22

例 10:用函数 patch 绘制填充图(图 1.10) fplot('humps',[0,2],'b') hold on patch([0.5 0.5:0.02:1 1],[0 humps(0.5:0.02:1) 0],'r'); hold off title('A region under an interesting function.') grid

图 1.10 填充图

我们还可以用函数 fill 来绘制类似的填充图. 例 11:用函数 fill 绘制填充图(图 1.11)

x=0:pi/60:2*pi; y=sin(x); x1=0:pi/60:1; y1=sin(x1); plot(x,y,'r'); hold on fill([x1 1],[y1 0],'g')

图 1.11 填充图

二、三维作图 1. mesh 语句 mesh 语句可以给出矩阵 Z 元素的三维消隐图,网络表面由 Z 坐标点定义,与前面叙述

的 x-y 平面的线格相同,图形由邻近的点连接而成.它可用来显示用其它方式难以输出的包

Page 23: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

23

含大量数据的大型矩阵,也可用来绘制 Z 变量函数. 显示两变量的函数 Z=f(x,y),第一步需产生特定的行和列的 x-y 矩阵.然后计算函数在

各网格点上的值.最后用 mesh 函数输出. 下面我们绘制 sin(r)/r 函数的图形.建立图形用以下方法:

x=-8:0.5:8; y=x'; x=ones(size(y))*x; y=y*ones(size(y))'; R=sqrt(x.^2+y.^2)+eps; z=sin(R)./R; mesh(x,y,z) %% 试运行 mesh(z),看看与 mesh(x,y,z)有什么不同之处?

各语句的意义是:首先建立行向量 x,列向量 y;然后按向量的长度建立 1-矩阵;用向

量乘以产生的 1-矩阵,生成网格矩阵,它们的值对应于 x-y 坐标平面;接下来计算各网格点

的半径;最后计算函数值矩阵 Z.用 mesh 函数即可以得到图形(图 1.12).

图 1.12 三维消隐图

第一条语句 x 的赋值为定义域,在其上估计函数;第三条语句建立一个重复行的 x 矩阵,

第四条语句产生 y 的响应,第五条语句产生矩阵 R(其元素为各网格点到原点的距离).用

mesh 方法结果如上. 另外,上述命令系列中的前 4 行可用以下一条命令替代:

[x, y]=meshgrid(-8:0.5:8) 2. 与 mesh 相关的几个函数 (1) meshc 与函数 mesh 的调用方式相同,只是该函数在 mesh 的基础上又增加了绘制相

应等高线的功能.下面来看一个 meshc 的例子: [x,y]=meshgrid([-4:0.5:4]); z=sqrt(x.^2+y.^2); meshc(x,y,z) %% 试运行 meshc(z),看看与 meshc(x,y,z)有什么不同之处?

我们可以得到图 1.13 所示的图形:

Page 24: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

24

图 1.13 meshc 图

地面上的圆圈就是上面图形的等高线. (2) 函数 meshz 与 mesh 的调用方式也相同,不同的是该函数在 mesh 函数的作用之上增

加了屏蔽作用,即增加了边界面屏蔽.例如: [x,y]=meshgrid([-4:0.5:4]); z=sqrt(x.^2+y.^2); meshz(x,y,z) %% 试运行 meshz(z),看看与 meshz(x,y,z)有什么不同之处?

我们得到如图 1.14 所示的图形:

图 1.14 meshz 图

3. 其它的几个三维绘图函数 (1) 在 Matlab 中有一个专门绘制圆球体的函数 sphere,其调用格式如下: [x,y,z]=sphere(n) 此函数生成三个(n+1)×(n+1)阶的矩阵,再利用函数 surf(x,y,z)可生成单位球面. [x,y,z]=sphere 此形式使用了默认值 n=20 sphere(n) 只绘制球面图,不返回值. 运行下面程序: sphere(30); axis square;

我们得到球体图形(图 1.15):

Page 25: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

25

图 1.15 球面图

若只输入 sphere 画图,则是默认了 n=20 的情况. (2) surf 函数也是 Matlab 中常用的三维绘图函数.其调用格式如下: surf(x,y,z,c) 输入参数的设置与 mesh 相同,不同的是 mesh 函数绘制的是一网格图,而 surf 绘制的

是着色的三维表面.Matlab 语言对表面进行着色的方法是,在得到相应网格后,对每一网

格依据该网格所代表的节点的色值(由变量 c 控制),来定义这一网格的颜色.若不输入 c,则默认为 c=z.

我们看下面的例子: %绘制地球表面的气温分布示意图. [a,b,c]=sphere(40); t=abs(c); %求绝对值 surf(a,b,c,t); axis equal colormap('hot')

我们可以得到图形如下(图 1.16):

图 1.16 等温线示意图

Page 26: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

26

4. 图形的控制与修饰 (1) 坐标轴的控制函数 axis,调用格式如下: axis([xmin,xmax,ymin,ymax,zmin,zmax]) 用此命令可以控制坐标轴的范围. 与 axis 相关的几条常用命令还有: axis auto 自动模式,使得图形的坐标范围满足图中一切图元素 axis equal 严格控制各坐标的分度使其相等 axis square 使绘图区为正方形 axis on 恢复对坐标轴的一切设置 axis off 取消对坐标轴的一切设置 axis manual 以当前的坐标限制图形的绘制 (2)grid on 在图形中绘制坐标网格.

grid off 取消坐标网格. (3)xlabel, ylabel, zlabel 分别为 x 轴, y 轴, z 轴添加标注.title 为图形添加标题. 以上函数的调用格式大同小异,我们以 xlabel 为例进行介绍: xlabel('标注文本','属性 1','属性值 1','属性 2','属性值 2',…) 这里的属性是标注文本的属性,包括字体大小、字体名、字体粗细等. 例如: [x, y]=meshgrid(-4:.2:4); R=sqrt(x.^2+y.^2); z=-cos(R); mesh(x,y,z) xlabel('x\in[-4,4]','fontweight','bold'); ylabel('y\in[-4,4]','fontweight','bold'); zlabel('z=-cos(sqrt(x^2+y^2))','fontweight','bold');

title('旋转曲面','fontsize',15,'fontweight','bold','fontname','隶书'); %%(图 1.17) 以上各种绘图方法的详细用法,请看联机信息.

图 1.17 添加标注

Page 27: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

27

三、统计回归图

对平面上 n 个点: 1 1 2 2( , ), ( , ), , ( , ),n nx y x y x y

在平面直线族{ | ,y a bx a b= + 为实数}中寻求一条直线 0 0y a b x= + ,使得散点到与散

点相对应的在直线上的点之间的纵坐标的误差的平方和最小,用微积分的方法可得:

0 22 2 2

( )( )( )

i i i i

i i i i

i i i i

x y x yn x y x y n n nb

n x x x xn n

−−= =

− −

∑ ∑ ∑∑ ∑ ∑∑ ∑ ∑ ∑

0 0 0i iy x

a b y b xn n

= − = −∑ ∑

所求得的这条直线: 0 0y a b x= + 称为回归直线.

例:已知如下点列,求其回归直线,并计算最小误差平方和. x 0.1 0.11 .12 .13 .14 .15 .16 .17 .18 .2 .21 .23 y 42 43.5 45 45.5 45 47.5 49 53 50 55 55 60 参考的程序如下: x=[0.1 0.11 .12 .13 .14 .15 .16 .17 .18 .2 .21 .23]; y=[42 43.5 45 45.5 45 47.5 49 53 50 55 55 60]; n=length(x); xb=mean(x); yb=mean(y); x2b=sum(x.^2)/n; xyb=x*y'/n; b=(xb*yb-xyb)/(xb^2-x2b); a=yb-b*xb; y1=a+b.*x; plot(x,y,'*',x,y1); %%图 1.18 serror=sum((y-y1).^2)

Page 28: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

28

图 1.18 回归直线

练习题

1.绘制下列曲线的图形(散点图与折线图):3 3 2 1, [ 1, 2]y x x x x= − − + ∈ −

2.绘制下列曲面的图形: 2 2 22z x y= + (提示:曲面由两部分构成)

3.在同一个图形上作下列两个函数的图象:

(1) 2sin ( ), [0, 2 ]y x x π= ∈ ; (2) 2cos ( ), [0, 2 ]y x x π= ∈

4.假如你有一组实测数据,例如: x=[53 56 60 67.5 75 90 110]; y=[109 120.5 130 141.1 157.5 180 185];

求其回归直线,画回归直线图形并计算最小误差平方和. 5.假如你有一组实测数据,例如:

x=[75 86 95 108 112 116 135 151 155 160 163 167 171 178 185]; y=[10 12 15 17 20 22 35 41 48 50 51 54 59 66 75];

求其回归直线,画回归直线图形并计算最小误差平方和. 6.随机产生 500 个 0 到 100 的整数 FS 作为学生的考试分数.

(1)画出 FS 的简单直方图(即:每个分数的频数); (2)画出每个分数段(0~10、10~20、…,90~100)的统计频数直方图;

7.非线性回归尝试 下表是到 1994 年的游泳世界纪录,试估计时间 y 与距离 x 的关系.

距离 x (米) 50 100 200 400 800 1500 时间 y (秒) 21.81 48.42 106.69 225 466.60 863.48

说明:用线性回归方法将得到: 11.0089 0.5961y x= − + ,但当 18x = 时, 0.2794y = − ,

Page 29: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

29

这是非常荒唐的结果!显然,一个基本要求是当 0x = 时 0y = .试尝试使用非线性回归模

型: by ax= .

第四节 Matlab 符号运算

Matlab 本身并没有符号计算功能,1993 年通过购买 Maple 的使用权后,开始具备符号

运算的功能.符号运算的类型很多,几乎涉及数学的所有分支. 一、Matlab 符号运算的工作流程 1. 工作过程

2. 核心工具

sym 函数 VS syms 语句 sym 函数:构造符号变量和表达式: a=sym('a') (Construct symbolic numbers, variables and objects) syms 语句:构造符号对象的简捷方式(Short-cut for constructing symbolic objects) 3. 符号变量确定原则 (1)除了 i 和 j 之外,字母位置最接近 x 的字母;若距离相等,则取 ASCII 码大的; (2)若没有除了 i 与 j 以外的字母,则视 x 为默认的符号变量; (3)可利用函数 findsym(string,N)来询问在众多符号中,哪 N 个为符号变量.例如:键

入 findsym(3*a*b+y^2,1),即可得到答案 y.更多的例子见下表:

符号表达式 默认符号变量 a*x^2+b*x+c x 1/(4+cos(t)) t 4*x/y x 2*a+b b 2*i x

二、Matlab 的六大常见符号运算 1. 因式分解 syms x f=x^6+1; s=factor(f) 结果为: s=(x^2+1)*(x^4-x^2+1) 2. 计算极限 求极限:

Page 30: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

30

0

ln( ) ln( )(1) lim ;h

x h xLh→

+ −= (2) lim 1

→∞

= −

n

n

xMn

syms h n x L=limit('(log(x+h)-log(x))/h',h,0) %%单引号可省略掉 M=limit('(1-x/n)^n',n,inf)

结果为: L =1/x M =exp(-x)

3. 计算导数

2

2

d d dsin , , ,d d dy y yy ax A B Cx a x

= = = =求 .

syms a x; y=sin(a*x); A=diff(y,x) B=diff(y,a) C=diff(y,x,2) 结果为: A = cos(a*x)*a B = cos(a*x)*x C = -sin(a*x)*a^2 4. 计算不定积分、定积分、反常积分

2

2 2

1 d( 2 2)

xI xx x

+=

− +∫ ,

20

cos dsin cos

xJ xx x

π

=+∫ ,

2

0e dxK x

+∞ −= ∫ .

syms x f=(x^2+1)/(x^2-2*x+2)^2; g=cos(x)/(sin(x)+cos(x)); h=exp(-x^2); I=int(f) J=int(g,0,pi/2) K=int(h,0,inf) 结果为: I =1/4*(2*x-6)/(x^2-2*x+2)+3/2*atan(x-1) J =1/4*pi K =1/2*pi^(1/2) 5. 符号求和

求级数 21

1n n

=∑ 的和 S, 以及前十项的部分和 S1.

Page 31: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

31

syms n S=symsum(1/n^2, 1, inf) S1=symsum(1/n^2,1,10) 结果为: S =1/6*pi^2 S1 =1968329/1270080

重要说明:当求函数项级数 21n

xn

=∑ 的和 S2 时,可用命令:

syms n x S2=symsum(x/n^2, n, 1, inf) 结果为:

S2 =1/6*x*pi^2 两点说明: (1)注意观察 S2 与 S1 的细微区别! (2)当通项公式的 Matlab 表达式较长时,表达式要加上单引号.后面的练习中会遇到

此问题. 6. 解代数方程和常微分方程 利用符号表达式解代数方程所需要的函数为 solve(f),即解符号方程式 f. 例如:求一元二次方程 a*x^2+b*x+c=0 的根.

f=sym('a*x^2+b*x+c') 或 f='a*x^2+b*x+c' solve(f)

ans= [1/2/a*(-b+(b^2-4*c*a)^(1/2))] [1/2/a*(-b-(b^2-4*c*a)^(1/2))]

solve(f, a) ans=

-(b*x+c)/x^2 利用符号表达式可求解微分方程的解析解,所需要的函数为 dsolve(f),使用格式:

dsolve('equation1', ' equation2', …) 其中:equation 为方程或条件.写方程或条件时,用 Dy 表示 y 关于自变量的一阶导数,

用 D2y 表示 y 关于自变量的二阶导数,依此类推.

(1)求微分方程 'y x= 的通解.

syms x y %定义 x,y 为符号 dsolve('Dy=x', 'x') ans =

1/2*x^2+C1 试比较: 若写成: syms x y %定义 x,y 为符号 dsolve('Dy=x') 结果将是什么?是否正确?为什么?

Page 32: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

32

(2)求微分方程" '(0) 1, '(0) 0

y x yy y

= + = =

的特解.

syms x y dsolve(‘D2y=x+Dy’, ‘y(0)=1’, ‘Dy(0)=0’, ‘x’) ans =

-1/2*x^2+exp(x)-x 试比较: 若写成: syms x y dsolve(‘D2y=x+Dy’, ‘y(0)=1’, ‘Dy(0)=0’) 结果将是什么?是否正确?为什么?

(3)求微分方程组'' 2

x y xy x= +

=的通解.

syms x y [x,y]=dsolve('Dx=y+x, Dy=2*x') x =

1/3*C1*exp(-t)+2/3*C1*exp(2*t)+1/3*C2*exp(2*t)-1/3*C2*exp(-t) y =

2/3*C1*exp(2*t)-2/3*C1*exp(-t)+2/3*C2*exp(-t)+1/3*C2*exp(2*t) 试比较: 若写成:

1) dsolve('Dx=y+x, Dy=2*x') 结果将是:

ans = x: [1x1 sym]

y: [1x1 sym] 试解释此结果的含义. 若写成:

2) [x,y]=dsolve('Dx=y+x, Dy=2x') 结果将是:

x = exp(t)*C1+C2*exp(t)-C2-2-2*t y =

C2+2*t 是否正确?为什么?

练习题

1.绘制下列曲线的图形(符号作图):3 3 2 1, [ 1, 2]y x x x x= − − + ∈ −

2.绘制下列曲面的图形: 2 2 22z x y= + (提示:曲面由两部分构成,符号作图)

Page 33: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

33

3.在同一个图形上作下列两个函数的图象:

(1) 2sin ( ), [0, 2 ]y x x π= ∈ ; (2) 2cos ( ), [0, 2 ]y x x π= ∈

4.求下列各结果:

(1)用 Matlab 因式分解:100 1x − .

(2)用 Matlab 求极限:

1

0

(1 ) elimx

x

xLx→

+ −= .

(3)用 Matlab 求积分:2

0sin dx x

+∞

∫ .

(4)用 Matlab 求幂级数: ( )8 8 1

0

∞+

=

−∑ n n

nx x 的和函数(化简结果).

5. (三维)符号作图尝试 命令 作用 解释 ezplot3 3-D parametric curve plotter 3D 参数曲线图形 ezcontour use contour plotter 等高线图 ezcontourf filled contour plotter 填充等高线图 ezmesh 3-D mesh plotter 3D mesh 曲面图形 ezmeshc combination mesh/contour plotter mesh 曲面/等高线图 ezsurf 3-D colored surface plotter 3D surf 曲面图形 ezsurfc combination surf/contour plotter surf 曲面/等高线图

请尝试以下的命令: ezplot3('sin(t)', ' cos(t)', 't', [0,6*pi]) ezcontour('x*exp(-x^2 - y^2)') ezcontourf('x*exp(-x^2 - y^2)') ezmesh('(s-sin(s))*cos(t)','(1-cos(s))*sin(t)','s',[-2*pi,2*pi]) ezmeshc('(s-sin(s))*cos(t)','(1-cos(s))*sin(t)','s',[-2*pi,2*pi]) ezsurf('x*exp(-x^2 - y^2)') ezsurfc('x*exp(-x^2 - y^2)')

6. 指出下面的 M1,M2,M3 分别是什么,并上机验证。 a=1; b=2; c=3;d=4; M1=[a,b;c,d]; eval(M1) M2='[a,b;c,d]'; eval(M2) M3=sym('[a,b;c,d]'); eval(M3)

7. 下面语句计算出来的 c1,c2 相等吗,为什么?上机验证。 a1=1e10; b1=1e-10; c1=(a1+b1-a1)/b1; a2=sym(a1); b2=sym(b1); c2=(a2+b2-a2)/b2; 补充:class(x) 查看变量 x 的数据类型

8. 简化表达式 2( ) cos sinf x x x= + − 。

Page 34: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

34

9. 设 A 是一个符号矩阵 (定义如下),试指出 findsym(A,1) 的输出结果,并由此能得出什

么结论? syms a b t u v x y; A=[a+b*x,sin(t)+u; x*exp(-t),log(y)+v]

10. 试指出下面两条命令的结果是否相同,如果不同,哪个是正确的?为什么? factor(sym('12345678901234567890')) factor(sym(12345678901234567890))

第五节 Matlab 编程基础

一、关系运算 1. 比较运算 比较两个同阶矩阵有下面六种相关操作符:

相关操作符 < 小于

<= 小于等于 > 大于

>= 大于等于 == 等于 ~= 不等于 表 5.1.1.1 相关操作符

比较两个元素的大小,结果是“1”表明为真,结果是“0”表明为假. 例如 2+2~=4 结果是“0”,表明为假. 例如一个 6 阶魔术方阵,矩阵元素计算满足各种条件: A=magic(6) ans = 35 1 6 26 19 24 3 32 7 21 23 25 31 9 2 22 27 20 8 28 33 17 10 15 30 5 34 12 14 16 4 36 29 13 18 11 阶数为 n 的魔术方阵,即 n×n 矩阵,是由 1~n2的整数组成(n=6).仔细观察这个矩阵,

我们会发现任何行和、任何列和都相等.另外,每个 3×3 子行列式的对角线元素和,都可

被 3 整除.为了显示这一特性,键入: p=(rem(A,3)==0) p = 0 0 1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 0

Page 35: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

35

0 1 0 0 1 0 为了再仔细地观察这个模式,可以用 format+格式画出矩阵的压缩格式.此格式用“+”

代表正元素,“-”代表负元素,空格代表 0. format + p = + + + + + + + + + + + + find 函数在关系运算中很有用,它可以在 0-1 矩阵中找非零元素的下标. 若 y 是一个向量,例如:y=[1 3 2 4 3.5 2.9],则 find(y<3.0),将指出 y 的

分量在哪些位置上小于 3.0. ans = 1 3 6 即:向量 y 的第 1、3、6 位置上的元素小于 3.0.

当先输入 x=0,再输入 x==NaN 时,结果为 0. 有一些测试函数与 NaN 有关.例如测试 x,输入 isnan(x)函数,如果 x 元素是不定值则

得 1,否则得 0.isfinite(x)更有用,如-∞<x<∞时则得 1. 2. 逻辑运算

& 与 | 或 ~ 非 表 5.1.2.1 逻辑运算符

“&”和“|”操作符可比较两个标量或两个同阶矩阵.对于矩阵来说必须符合规则,

如果 A 和 B 都是 0-1 矩阵,则 A&B 或 A|B 也都是 0-1 矩阵,这个 0-1 矩阵的元素是 A 和 B对应元素之间逻辑运算的结果,逻辑操作符认定任何非零元素都为真,给出“1”,任何零元

素都为假,给出“0”. 非(或逻辑非)是一元操作符,即~A:当 A 是非零时结果为“0”;当 A 为“0”时,结果

为“1”.因此下列两种表示: p | (~p) 结果为 1. p & (~p) 结果为 0. any 和 all 函数在连接操作时很有用,设 x 是 0-1 向量,如果 x 中任意有一元素非零时,

any(x)返回“1”,否则返回“0”;all(x)函数当 x 的所有元素非零时,返回“1”,否则也返回

“0”.这些函数在 if 语句中经常被用到.如: if all(A<5)

do something end 二、控制流 Matlab 与其它计算机语言一样,也有控制流语句.控制流语句可使原本简单地在命令

行中运行的一系列命令或函数,组合成为一个整体——程序,从而提高工作效率. 1. for 循环 Matlab 与其它计算机语言一样有 do 或 for 循环,完成一个语句或一组语句在一定时间

内反复运行的功能.例如:

Page 36: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

36

for i = 1:n , x( i )=0, end x 的第一个元素赋 0 值,如果 n<1,结构上合法,但内部语句不运行,如果 x 不存在或

比 n 元素小,额外的空间将会自动分配. 多重循环写成锯齿形是为了增加可读性.例如: m=9;n=9; for i = 1:m

for j=1:n A( i, j ) = 1/( i + j - 1);

end end A 程序的说明: (1)事实上,上述程序给出了 Hilbert 矩阵的构造过程,可参见函数 hilb(n). (2)语句内部使用分号,表示计算过程不输出中间结果. (3)循环后的 A 命令表示显示矩阵 A 的结果. (4)每个 for 语句必须以 end 语句结束,否则是错误的. for 循环的通用形式为:

for v=expression statements

end 其中 expression 表达式是一个矩阵,因为 Matlab 中都是矩阵,矩阵的列被一个接一个

的赋值到变量 v,然后 statements 语句运行. 通常 expression 是一些 m:n 或 m:k:n 仅有一行的矩阵,并且它的列是个简单的标量.但

如注意到 expression 可以为矩阵,即 v 可以为向量,对某些问题的处理将大大简化. 2. while 循环 Matlab 中的 while 循环语句为一个语句或一组语句在一个逻辑条件的控制下重复未知

的次数. 它的一般形式为:

while expression statements

end 当 expression 的所有运算为非零值时,statements 语句组将被执行.如果判断条件是向量

或矩阵的话,可能需要 all 或 any 函数作为判断条件. 例如计算 expm(A),在 A 并不是太大时,直接计算 expm(A)是可行的.

expm(A)=I+A+A^2/2!+A^3/3!+… 注意:这里的 I 表示单位矩阵. 程序为:

E = 0*A; F = E + eye(size(E)); N = 1; while norm(F,1) > 0,

F = A*F/N; E = E + F; N = N + 1;

end 3. if 和 break 语句 下面介绍 if 语句的二个例子.

Page 37: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

37

(1) 一个计算被分成三个部分: if n<0

A=negative(n) elseif mod(n,2)==0

A=even(n) else

A=odd(n) end

其中的三个函数 negative(n)、even(n)、odd(n)是自编的输出函数.参见下面的函数文件. (2) 这个例子涉及数论中一个很有趣的问题,取任何的正整数,如果是偶数,用 2 除;

如果是奇数,用 3 乘,并加上 1,反复这个过程,直到你的整数成为 1.这个极有趣不可解

的问题是:有使这个过程不中止的整数吗? %classic "3n+1"problem from number theory while 1 n=input('Enter n, negative quits: '); if n<=0 break,end while n>1 if rem(n,2) == 0 %% 是连续的 2 个等号 n=n/2 else n=3*n+1 end; end end

这个过程能永远进行吗? 程序的说明: ①本程序用到了 if 语句与 while 语句,过程比较复杂; ②使用 input 函数,可使程序在执行过程中,从键盘输入一个数(矩阵); ③break 语句提供了程序跳出死循环的途径. 三、M 文件、命令文件及函数文件 1. M 文件 Matlab 通常使用命令驱动方式,当单行命令输入时,Matlab 立即处理并显示结果,同

时将运行说明或命令存入文件. Matlab 语句的磁盘文件称作 M 文件,因为这些文件名的未尾是.m 形式,例如一个文件

名为 bessel.m,提供 bessel 函数语句. 一个 M 文件包含一系列的 Matlab 语句,一个 M 文件可以循环地调用它自己. M 文件有两种类型: 第一类型的 M 文件称为命令文件,它是一系列命令、语句的简单组合. 第二类型的 M 文件称为函数文件,它提供了 Matlab 的外部函数.用户为解决一个特定

问题而编写的大量的外部函数可放在 Matlab 工具箱中,这样的一组外部函数形成一个专用

的软件包. 这两种形式的 M 文件,无论是命令文件,还是函数文件,都是普通的 ASCII 文本文件,

可选择编辑或字处理文件来建立. 2. 命令文件

Page 38: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

38

当一个命令文件被调用时,Matlab 运行文件中出现的命令而不是交互地等待键盘输入,

命令文件的语句在工作空间中运算全局数据,对于进行分析解决问题及做设计中所需的一长

串繁杂的命令和解释是很有用的. 例如:一个自编的命令文件 fibo.m,用于计算 Fibonnaci 数列

% An M-file to calculate Fibonnaci numbers f=[1, 1 ]; i = 1; while f(i)+f(i+1)<1000

f(i+2)=f(i)+f(i+1); i=i+1;

end plot(f)

在 Matlab 命令窗口中键入 fibo 命令,并回车执行,将计算出所有小于 1000 的 Fibonnaci数,并绘出图形.

要注意的是:文件执行后,f 和 i 变量仍然留在工作空间. 3. 函数文件 如果 M 文件的第一行包含 function,这个文件就是函数文件,它与命令文件不同,所定

义变量和运算都在文件内部,而不在工作空间.函数被调用完毕后,所定义变量和运算将全

部释放.函数文件对扩展 Matlab 函数非常有用. 例如:一个自编的函数文件 my_mean.m,用于求向量的(或矩阵按列的)平均值

function y= my_mean(x) % MY_MEAN Average or mean value,For Vectors, % MY_MEAN (x) returns the mean value % For matrix MY_MEAN (x) is a row vector % containing the mean value of each column [m,n]=size(x); if m==1

m=n; end y=sum(x)/m;

磁盘文件中定义的新函数称为 my_mean 函数,它与 Matlab 函数一样使用,例如 z 为从

1 到 99 的实数向量: z=1:99; 计算均值:my_mean(z)

ans= 50

my_mean.m 程序的说明: (1)第一行的内容:函数名,输入变量,输出变量,没有这行这个文件就是命令文件,

而不是函数文件. (2)%:表明%右边的行是说明性的内容注释.前一小部分行来确定 M 文件的注释,

并在键入 help my_mean 后显示出来.显示内容为连续的若干个%右边的文字. (3)变量 m,n 和 y 是 my_mean 的局部变量,在 my_mean 运行结束后,它们将不在工

作空间 z 中存在.如果在调用函数之前有同名变量,先前存在的变量及其当前值将不会改变. 再例如:一个计算标准差的函数文件 stat.m

function [mean,stdev]=stat(x)

Page 39: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

39

[m,n]=size(x); if m==1

m=n end mean=sum(x)/m; stdev=sqrt(sum(x.^2)/m-mean.^2);

stat 表明返回多输出变量是可能的. 又如:使用多输入变量计算矩阵秩函数

function r=rank(x,tol) % rank of a matrix s=svd(x); if(nargin==1)

tol=max(size(x))*s(1)*eps; end r=sum(s>tol);

这个变量说明利用永久变量 nargin 确定输入变量的个数,变量 nargout 虽然这里没有使

用,但它包含有输出变量的个数. 一些有用的说明: 当 M 函数文件第一次在 Matlab 运行时,它被编译并放入内存,以后使用时不用重新编

译即可得到. what 命令:显示磁盘当前目录中的 M 文件. dir 命令:列出所有文件. 一般而言,输入一个名字到 Matlab,例如键入 whoopie 命令,Matlab 用以下步骤解释: (1) 看 whoopie 是否为变量. (2) 检验 whoopie 是否为在线函数. (3) 检验 whoopie 文件的当前目录. (4) 将 whoopie 看成 Matlab 的 PATH 中的一个文件,在 Matlab PATH 目录中搜索. 如果 whoopie 存在,Matlab 首先将其作为变量而不是作为函数. 四、字符串、输入及输出 1. echo、input、pause、keyboard 一般来说,当一个 M 文件运行时,文件的命令不在屏幕上显示,而 echo 命令则使 M 文

件运行时,命令在屏幕上显示,这对于调试、演示相当有用. input 功能:输入 input('How many apples')给用户一个提示串,等待,然后显示用户通过

键盘输入的大量表达式.可以用 input 命令建立驱动 M 文件的菜单. 与 input 功能相同,但功能更强的 keyboard 命令将计算机作为一个命令文件来调用,放

入 M 文件中,此特性对调试或正在运行期间修改变量很有用. pause 命令:使用户暂停运行一个程序,当再按任一键时恢复执行,pause(n)等待 n 秒钟

后再继续执行. 2. 串和宏串 字符串用单个引号输入到 Matlab 中,例如:

s='Hello' 结果显示为:

s = Hello

Page 40: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

40

字符存在向量中,每个元素就是一个字符,如: size(s) ans =

1 5 表明 S 为一个 1×5 的矩阵,有五个元素.字符以 ASCII 值存入,abs 函数或 double 函

数将显示以下值(即 Hello 的 ASCII 值) abs(s) ans = 72 101 108 108 111

getstr 函数,使向量作为字符显示,而不显示 ASCII 值. disp 可在变量中显示字符.sprintf, num2str 和 int2str 可以将数字转换成串. 字符变量通过括号连成大串.例如: s='hello'; s=[s,' world'] s =

hello world eval 是与字符变量—起工作的函数,执行简单字符宏调用.eval( t )执行包含在 t 内的字

符.如果 t 是任何 Matlab 表达式或语句的源字符,则字符串被解释执行.例如: t='eye(2)', eval(t) 结果为:

ans= 1 0 0 1

又例如,给矩阵元素赋值 t='1/(i+j-1)'; for i=1:n

for j=1:n a( i, j)=eval(t);

end end

这儿有一个例子,介绍如何一起使用 eval 与 load 命令,装入十个具有顺序文件名的文

件中的数据: fname='mydata'; for i = 1:10

eval([ 'load ', fname, int2str( i )]) end

3. 外部程序 Matlab 与外部独立程序的通讯方式可以是多种多样的,下面介绍其中的一个办法: (1) Matlab 中将变量存入磁盘 (2) 运行外部程序(读数据文件,进行处理),将结果写到磁盘上 (3) 将处理后的文件装回到工作空间中 例如:用外部程序 gareqn 找 garfield 方程的结果:

function y=garfield(a,b,q,r) save gardata a,b,q,r

Page 41: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

41

! gareqn load gardata

使用 FORTRAN 或其它语言写 gareqn 程序,使其可以读 gardata.mat,进行处理,将结果

存入文件中. 这个程序可将计算机的“连接码”提供给 Matlab,在许多系统中它将新的目标码连接

到程序中比物理联接要方便得多. 4. 输入输出数据 可使用各种方法将其它程序和外部世界的数据送入 Matlab,同样可把 Matlab 数据输送

到外部世界,使你的程序以 Matlab 使用的文件形式直接计算数据. 最好的方法取决于多少数据,数据是否可读,什么形式等: (1) 清晰的元素表输入: 如果你有少量数据,比如说小于 10~15 个元素,使用方括号[]输入. (2) 使用文本编辑建立命令文件,将数据列为清晰的元素表输入.如果数据不是可读形

式,又不得不以一种方法键入,可以重复运行 M 文件,重复修改数据. (3) 如果数据以 ASCII 形式存贮,并有固定长度,行尾有回车符,各数间有空格的文件

称为 flat file(ASCII 的 flat file 可由普通文本编辑来编辑),flat file 通过 load 命令直接读进

Matlab,结果存入名为文件名的变量中去. (4) 将数据文件译成 Matlab 文件形式,使用 load 命令,translate 程序由 Matlab 中的应

用程序库支持,translate 程序将 ASCII 文件、二进制文件、FORTRAN 非格式文件和 DIF 文

件转换为 Matlab 使用的特定的 MAT 文件,当磁盘文件中存有大量数据时,这个方法输入

最好. Matlab 数据输出到外部世界的方法: (1) 小矩阵时:使用 diary 命令建立日志文件,在文件中列出变量,用文本编辑处理日志

文件,日志的输出包括运行中的 Matlab 命令. (2) 使用 save 命令存入变量,退出 Matlab,用 translate 程序将 MAT 文件转换成任一种

其它文件形式.

练习题 1.如何用程序方式建立如下的矩阵?

(1)

10 10

2004 0 00 2004 0

0 0 2004×

; (2)

10 10

0 10 1010 0 10

10 10 0×

(3)

10 10

2004 1 11 2004 1

1 1 2004×

; (4)

10 10

10 10 1010 10 10

10 10 10×

− − − − − −

Page 42: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

42

(5)

10 0 01 20 0

1 1 100

(6)

1 1 12 3 111 1 13 4 12

1 1 111 12 20

(7)

2004 20 0 0 00 2004 30 0 00 0 2004 40 00 0 0 2004 500 0 0 0 2004

(8)

10 1 120 20 1

100 100 100

2. 试说明下面两段程序的功能,最后两个 x 值为多少? x=1; while x+x>x, x=x/2; end x=1; while x+x>x, x=2*x; end

3. 已知 sin(x) 的幂级数展开公式为3 5 7

sin( )3! 5! 7!x x xx x= − + − +

试利用这个公式计算 sin(π/2)和 sin(31π/2) 的值,并与 Matlab 自带的 sin 函数比较,

误差分别为多少? 4. 兔子繁殖问题:( Fibonacci number )

假设每对兔子每月生出一对小兔,且新生的兔子满二个月后就能生育,那么从刚出生的

一对小兔算起,12 个月后总共有多少对兔子?三年后呢?试编写一个函数计算该题,输入

为月数,输出为兔子对数。 5. 编写一个函数,要求实现以下功能:

当输入一个参数时,输出错误信息,并返回;当输入两个或三个参数时,计算它们的阶

乘的和。

第一章阅读材料:Learning MATLAB in English

(摘自:《Learning MATLAB》, Tobin A. Driscoll, University of Delaware Newark, Delaware)

(A) MATLAB Introduction

The MATLAB software package is used for computation in engineering, science, and applied

mathematics. It offers a powerful programming language, excellent graphics, and a large standard

library.

The focus in MATLAB is on computation, not mathematics: symbolic expressions and

Page 43: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

43

manipulations are not possible, except through the optional Symbolic Toolbox, which is not

covered in this book. All variables must have values, and all results are numerical and potentially

inexact, thanks to the rounding errors inherent in computer arithmetic. The emphasis on numerics

is typical for most work in scientific computation.

Compared to other numerically oriented languages, such as C++ and Fortran, MATLAB is

usually found to be much easier to use. However, its execution speed can be slower. This gap is

not always as dramatic as popular lore has it, and it can often be narrowed or closed with good

MATLAB programming. Moreover, one can link other types of code into MATLAB, or vice versa,

and MATLAB has some optional support for parallel computing. Still, MATLAB is usually not the

tool of choice for high-performance computing.

Whatever you think of these or other limitations of MATLAB, they have not held back its

popularity: a recent search for “matlab” on the books section of Amazon.com turned up 8,543

results! Rapid code development and interaction with data often trump execution speed, and the

integrated graphics and expert routines that come with MATLAB can be decisively helpful. Even

for speedhungry users, MATLAB can be a valuable environment in which to explore and fine-tune

algorithms before creating production code in another environment.

Successful computing languages and environments reflect a distinctive set of values. In

MATLAB, those values include an emphasis on experimentation and interaction with data and

algorithms; syntax that is compact, friendly, and interactive (rather than tightly constrained and

verbose); a kitchen-sink mentality for providing functionality; and a predilection for vectors,

matrices, and arrays.

(B) MATLAB Arrays and Matrices

The heart and soul of the MATLAB software is linear algebra. In fact, “MATLAB” was

originally a contraction of “matrix laboratory.” More so than any other language, MATLAB

encourages and expects you to make heavy use of arrays, vectors, and matrices.

Some jargon: An array is a collection of numbers, called elements or entries, referenced by

one or more indices running over different index sets. In MATLAB, the index sets are always

sequential integers starting with 1. The dimension of the array is the number of indices needed to

Page 44: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

44

specify an element. The size of an array is a list of the sizes of the index sets.

A matrix is a two-dimensional array with special rules for addition, multiplication, and other

operations. It represents a mathematical linear transformation. The two dimensions are called rows

and columns. A vector is a matrix for which one dimension has only the index 1: a row vector has

only one row, and a column vector has only one column.

Although an array is more general and less mathematical than a matrix, the terms are often

used interchangeably. What’s more, in MATLAB there is really no formal distinction. The

commands in this chapter are sorted according to the array/matrix distinction, but MATLAB will

let you mix them freely as long as the syntax is defined. The idea—here, as elsewhere—is that

MATLAB keeps the language simple, natural, and succinct. It’s up to you to stay out of trouble.

(C) MATLAB functions and scripts

Both functions and scripts gather MATLAB statements to perform complex tasks. The most

important distinguishing feature of a function is its local workspace. Any variables created while

the function executes are available only within that invocation of the function, unless you go out

of your way to bend the rules (see section 6.4). Conversely, the variables available to the

command line—those in the base workspace—are normally not visible within the function. If

other functions are called during a function’s execution, each of those secondary calls also sets up

a private local workspace. These restrictions on data access are called scoping, and they make it

possible for you to write complex programs that use many components without worrying about

variable name clashes. You can always see variables in the current workspace by typing whos, or

in the Workspace window of the desktop. At the command line, the base workspace is ordinarily

in context, but during function debugging you can inspect other local workspaces.

Each function starts with a line such as

-------------------------------------------------------------------------------------------------

function [out1,out2] = myfun(in1,in2,in3)

-------------------------------------------------------------------------------------------------

The name myfun should match the name of the file on disk. The variables in1, etc. are input

arguments, and out1, etc. are output arguments. You can have as many as you like of each type

Page 45: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

45

(including zero) and call them whatever you want. Theoretically, the only communication between

a function’s workspace and that of its caller is through the input and output arguments, though

there are some exceptions (see section 6.4). The values of the input arguments to a function are

copies of the original data, so any changes you make to them will not change anything outside of

the function’s scope.

(D) MATLAB Graphics Graphical display is one of the greatest strengths of the MATLAB software, and one of its

most complicated subjects. The basics are quite simple, but you also get complete control over

practically every aspect of each graph, and with that power comes some complexity.

Graphical objects are classified by type, the most important of which are shown in Figure 5.1.

The available types lie in a strict hierarchy: each datarelevant object, such as a line or surface,

must lie in an axes, which in turn lies in a figure window, descended from a virtual root. Of the

command names in Figure 5.1, the most useful is figure, which by itself opens a new figure

window. The others, such as line and surface, are considered low-level functions and are not

usually called directly. Instead you use friendlier functions that create these object types inside the

most recently created or clicked-on axes. Similarly, a group or series graphics object is typically a

collection of more primitive objects that are created and bundled together by a convenient routine.

Each rendered graphics object has properties that you can set at creation time or after the fact

to control its appearance. You can also add axes labels, titles, and other annotations to the graph.

Most graphical modifications can be done either via the command line or by using the GUI

(graphical user interface). In particular, the Edit Plot button, which has the icon , enables you to

double-click or right-click virtually any graphical object to change its attributes. While there are

examples of making changes in which one method is clearly preferred, for the most part the choice

is a matter of personal comfort.

Page 46: 第一章 Matlab 用法简介 - math.ecnu.edu.cn · 第一章 Matlab 用法简介 第一节 Matlab 快速入门 一、Matlab 的安装 Matlab 有各种版本,早期有Matlab 1.0

46