首页数学计算数学MATLAB基础与应用 03 第三章 数组与矩阵操作.pptx

03 第三章 数组与矩阵操作.pptx

页数:78页文件大小:265.7 KB来源: MATLAB基础与应用ppt课件

本课件系统讲解MATLAB中数组与矩阵的操作方法:先介绍一维、二维及高维数组的创建与寻访,再讲解矩阵的算术、关系与逻辑运算,随后展开多项式求值求根、稀疏矩阵存储与矩阵分析函数,并汇总常用特殊矩阵的生成方式。

第3章数组与矩阵操作封面,标示本章主题为数组的创建使用、矩阵相关操作与多项式运算
第3章学习目标页,列出掌握数组创建使用、矩阵相关操作与多项式运算三项要求
第3章知识结构图,展示数组创建与操作、矩阵代数、线性方程组与矩阵分解、多项式运算四大板块
查看本课件的文字版(共 78 页,供检索与复制)

第1页:第3章 数组与矩阵操作

本页为《MATLAB基础与应用》第3章 数组与矩阵操作的章节封面。

第2页:本章学习目标

学习目地

  • 掌握数组的创建及其使用方法
  • 掌握矩阵的相关操作
  • 掌握多项式运算相关问题

第3页:本章知识结构

本章知识结构:数组与矩阵的操作分为四大板块。

  • 数组的创建:一维数组、二维数组、多维数组、字符数组的创建
  • 数组的操作:数组的基本操作、非数和空数组
  • 矩阵代数:矩阵创建及其操作、线性方程组与矩阵分解
  • 多项式运算:多项式的建立、求根、求解与四则运算

第4页:3.1 数组创建

数组
程序设计中为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种形式,这些按序排列的同类数据元素的集合称为数组。一个数组可以分解为多个数组元素。

3.1.1 一维数组创建:在MATLAB中数组就是一行或者一列的矩阵,对矩阵的输入、修改、保存都适用于数组,MATLAB还提供了一些创建数组的特殊指令,数组创建方法不是单一的。下面介绍常用的数组创建方法。

第5页:一维数组的创建方法

一维数组常用的创建方法

  1. 创建一维「行」数组(向量):用 [a,b,c,d] 或 [a b c d],元素之间可用逗号或空格隔开
  2. 创建一维「列」数组(向量):用 [a;b;c;d],元素之间用分号隔开(分号必须是英文输入格式)
  3. 由冒号「:」创建等差数组:y=j:i:k 表示从j到k步长为i的等差数组,i默认为1
  4. 由linspace函数生成等差数组:y=linspace(start_num,stop_num,n),在首元素start_num与末元素stop_num之间共生成n个元素,不指定n时默认为100
  5. 由logspace函数创建等比数列:y=logspace(start_num,stop_num,n),生成从10start_num到10stop_num之间按对数等分的n个元素

第6页:例3-1 数组的创建

例3-1:数组的创建。

>> Z = 1:-0.25:0 % 冒号创建等差数组 Z = [ 1 , 0.75 , 0.5 , 0.25 , 0 ] >> a=rand(1,3) % 随机生成数组 A = 0.9501 0.2311 0.6068 >> Z = linspace( 5 , 20 , 4 ) % 函数生成等差数组 Z = [ 5 , 10 , 15 , 20 ] >> b=logspace(1,3,3) % 生成从10^1到10^3之间按对数等分的3个元素 b = 10 100 1000 >> c=0:pi/4:pi c = 0 0.7854 1.5708 2.3562 3.1416 >> d=1:-0.2:0

第7页:3.1.2 二维数组创建

d = 1.0000 0.8000 0.6000 0.4000 0.2000 0 >> e=[1 pi/2 sqrt(2) 1+5i] e = 1.0000 1.5708 1.4142 1.0000 + 5.0000i

前面介绍的数组只有一个下标,称为一维数组,其数组元素也称为单下标变量。实际问题中有很多量是二维或多维的,MATLAB允许构造多维数组,多维数组元素有多个下标,也称为多下标变量。本小节介绍二维数组的创建方法。

第8页:例3-2 二维数组创建

例3-2:二维数组创建。

>> A=[1,2,3;4,5,6;7,8,9;10,11,12] A = 1 2 3 4 5 6 7 8 9 10 11 12

在MATLAB中,矩阵输入最简单的方法是直接输入法,不必对矩阵维数做任何说明,存储将自动配置。直接输入矩阵时,矩阵元素用空格或逗号分隔,矩阵行用「;」或回车键隔离,整个矩阵放在方括号 [ ] 里。

说明:指令执行后,矩阵A被保存在MATLAB的工作间Workspace中以备后用,如果用户不用 clear 指令清除它或对它重新定义,该矩阵会一直保存直到本MATLAB指令窗被关闭为止。

第9页:例3-3 利用函数创建数组

例3-3:利用MATLAB函数创建数组。

>> magic(3) % 魔方矩阵函数 ans = 8 1 6 3 5 7 4 9 2 >> ones(2,3) % 生成2×3的元素为1的数组 ans = 1 1 1 1 1 1 >> randn('state',0) % 生成随机数的方式 >> randn(2,3) % 生成2×3的正态随机数组 ans = -0.4326 0.1253 -1.1465 -1.6656 0.2877 1.1909 >> a=eye(3) % 生成主对角线元素为1的3×3单位数组

第10页:diag函数构成与提取对角线

以向量 v 的元素作为矩阵 X 的第 k 条对角线元素:当 k=0 时,v 为 X 的主对角线;当 k>0 时,v 为上方第 k 条对角线;当 k<0 时,v 为下方第 k 条对角线。

a = 1 0 0 0 1 0 0 0 1 >> v=[1 2 3]; >> x=diag(v,-1) >> b=diag(a) % 将矩阵a的对角线元素赋给数组b b = 1 1 1

第11页:diag、randsrc与复数矩阵构造

x = 0 0 0 0 1 0 0 0 0 2 0 0 0 0 3 0 >> randsrc(3,5,[-3,-1,1,3],1) % 随机生成3×5的数组,元素由[-3,-1,1,3]构成 ans = 3 1 3 -1 -3 1 3 1 3 -1 3 -1 3 -1 1 >> a=2.35; b=3/7; >> C=[1,2*a+i*b,b*sqrt(a); sin(pi/4),a+5*b,3.5+i] C = 1.0000 4.7000 + 0.4286i 0.6570 0.7071 4.4929 3.5000 + 1.0000i

第12页:数组的内存存放顺序

对于一个数组、矩阵或行列式,MATLAB环境中对数据的物理存放(内存中的单元存放)顺序是:第一列的单元,第二列单元,…最后一列。

例3-4:3×3数组 y,其顺序存放方式如下。

y = 1 7 6 3 2 8 5 4 0 >> y(:) ans = 1 3 5 7 2 4 6 8 0

第13页:3.1.3 多维数组创建

对于多维的数组,把第二维以后的维数作为数据平面(plane)来看,存放的顺序是:第一个plane(也可叫做层)中的矩阵,第二个plane中的矩阵……且每一个plane中的数组存放顺序是第一列单元、第二列单元,…最后一列。

例3-5:设定一个多维数组。

>> x=[1,2;3,4]; x(:,:,2)=[5,6;7,8] x(:,:,1) = 1 2 3 4

第14页:例3-5 多维数组存放与下标换算

x(:,:,2) = 5 6 7 8 >> x(:) ans = 1 3 2 4 5 7 6 8

可以从单元的逻辑下标算出它所在的物理位置,相反的计算也是一定的。如维数 [d1,d2,d3] 的三维数组中的一个单元 (a,b,c) 的物理位置是 (a-1)*d2*d3+(b-1)*d3+c。

第15页:例3-6 多维数组示例

例3-6:多维数组示例。

>> A(3,2)=1 % 单元素赋值创建数组 A = 0 0 0 0 0 1 >> B(3,6,:)=1:3 % 子数组赋值创建数组 B(:,:,1) = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 B(:,:,2) = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 B(:,:,3) = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3

第16页:例3-7 低维数组合成高维数组

例3-7:低维数组合成高维数组。

>> clear, A=ones(2,3); A(:,:,2)=ones(2,3)*2; A(:,:,3)=ones(2,3)*3 A(:,:,1) = 1 1 1 / 1 1 1 A(:,:,2) = 2 2 2 / 2 2 2 A(:,:,3) = 3 3 3 / 3 3 3

第17页:3.1.4 字符数组

3.1.4 字符数组:用来存放字符量的数组称为字符数组,字符数组类型说明的形式与数值数组相同。

例3-8:字符串数组示例。

>> D=strvcat('Hello','Yes','No','Goodbye') % 用串操作函数创建串数组 D = Hello Yes No Goodbye

由于字符串相关操作在前面已经介绍过,本节不再对字符数组的操作展开叙述。

第18页:3.2.1 数组运算与点运算

3.2 数组操作 1.数组的加、减、乘、除以及一般函数运算

数组运算除了作为1×n的矩阵应遵循矩阵的运算规则外,MATLAB还为数组提供了一些特殊的运算:乘法为「.*」,左除为「.\」,右除为「./」,乘幂为「.^」。

例3-9:数组运算例题。

>> a=3:6 % 定义数组a a = 3 4 5 6 >> b=3.3:4:11.3 % 定义数组b b = 3.3000 7.3000 11.3000

第19页:例3-9、例3-10 数组逐元素运算

>> a.^2 % 数组a的每一个元素求平方 ans = 9 16 25 36

例3-10:计算 y=tan(x) 的值。

>> x=-pi:pi/2:pi; % 定义自变量x >> y=tan(x) % 求x的每一个元素对应的正切值 y = 1.0e+016 * 0.0000 -1.6331 0 1.6331 -0.0000

2.MATLAB在基本统计处理功能(1)取最大值、最小值与求中值:MAX函数用来查取数据序列的最大值。

  • [Y,I]=max(X):返回矩阵X的各列中的最大元素值及其位置赋予行向量Y与I;X为向量时,Y与I为单变量
  • [Y,I]=max(X,[],DIM):按数组X的第DIM维的方向查取最大元素值及其位置

第20页:例3-12 MAX函数查最大值

MIN函数用来查取数据序列的最小值,用法与命令格式与MAX函数完全一样,执行结果为最小值。

例3-12:查找下面3×4的二维数组 x 中各列和各行元素中的最大值。

>> x=[1 8 4 2;9 6 2 5;3 6 7 1] % 产生二维数组x x = 1 8 4 2 9 6 2 5 3 6 7 1 >> y=max(x) % 查出各列元素的最大值赋予行向量y y = 9 8 7 5 >> [y,i]=max(x) % 各列最大值及其行下标 y = 9 8 7 5 i = 2 1 3 2

说明:源文件该例矩阵 x 的定义行与回显行存在不一致(回显中第二、三行为 3 6 7 1 与 9 6 2 5),此处按定义式 [1 8 4 2;9 6 2 5;3 6 7 1] 统一,结果以定义式为准。

第21页:max函数按列与按行查找

>> [y,i]=max(x,[ ],1) % 按列查最大值 y = 9 8 7 5 i = 2 1 3 2 >> [y,i]=max(x,[ ],2) % DIM=2,在各行中按行查最大值 y = 8 7 9 i = 2 3 1

例3-13:取两个2×3的二维数组所有同一位置上的元素值大者构成一个新矩阵。

第22页:例3-13 与 MEDIAN函数中值

>> x=[4 5 6;1 2 3] % 产生二维数组x >> y=[3 7 5;4 5 1] % 产生二维数组y >> c=max(x,y) % 同一位置上取最大值 x = 4 5 6 / 1 2 3 y = 3 7 5 / 4 5 1 c = 4 7 6 / 4 5 3

所谓中值,是指在数据序列中其值的大小恰好在中间。例如数据序列 8,-3,5,7,10 的中值为7;偶数个时,中值等于中间两项的平均值。

  • Y=median(X):返回矩阵X各列元素的中值赋予行向量Y;X为向量时Y为单变量

第23页:例3-14、例3-15 求中值

Y=median(X,DIM):按数组X的第DIM维方向的元素求其中值赋予向量Y;DIM=1按列操作,DIM=2按行操作。

例3-14:试分别求下面数列 x 与 y 的中值。

>> x=[8 -3 5 7 10]; % 奇数个元素 >> xmedian=median(x) xmedian = 7 >> y=[8 -3 5 7 10 12]; % 偶数个元素 >> ymedian=median(y) ymedian = 7.5000

例3-15:对下面二维数组 x,从不同维方向求出其中值。

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

第24页:例3-15 求中值结果

>> y0=median(x) % 按列操作 y0 = 3 6 4 2 >> y1=median(x,1) % DIM=1,按列操作,结果y1为行向量 y1 = 3 6 4 2 >> y2=median(x,2) % DIM=2,按行操作,结果y2为列向量 y2 = 3.0000 5.5000 4.5000

(2)求和、求平均值与求积:命令分别为 sum 函数、MEAN 函数以及 prod 函数。

  • Y=sum(X):返回矩阵X各列元素之和赋予行向量Y;X为向量时Y为单变量
  • Y=sum(X,DIM):按第DIM维方向求其和;DIM=1按列,DIM=2按行

第25页:mean与prod函数的调用格式

  • Y=mean(X):返回矩阵X各列元素的平均值赋予行向量Y;X为向量时Y为单变量
  • Y=mean(X,DIM):按第DIM维方向求平均值;DIM=1按列,DIM=2按行
  • Y=prod(X):返回矩阵X各列元素之积赋予行向量Y;X为向量时Y为单变量
  • Y=prod(X,DIM):按第DIM维方向求其积;DIM=1按列,DIM=2按行

例3-16:求和、求平均值与求积示例。

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

第26页:例3-16 sum、mean、prod结果

>> y1=sum(x,1); y2=sum(x,2) y1 = 5 7 9 y2 = 15 6 >> y1= mean(x,1); y2= mean(x,2) y1 = 2.5000 3.5000 4.5000 y2 = 5 2 >> y1= prod(x,1) y1 = 4 10 18

第27页:累计和、标准方差与排序函数

>> y2= prod(x,2) y2 = 120 6

(3)求累计和、累积积、标准方差与升序排序:MATLAB提供的函数分别为 CUMSUM、CUMPROD、STD 和 SORT,这里仅 STD 函数为MATLAB程序,其余均为内部函数,其调用参数与操作方式都与 MEDIAN 函数基本一样。

3.对数组的操作运算 (1)二维数组的操作运算:在数组中「:」代表任意维数的值,比如任意行或列;「end」代表维数中最后位的值。

第28页:例3-17 数组元素的标识和寻访

例3-17:数组元素及子数组的各种标识和寻访格式,冒号的使用,end的作用。

>> x=zeros(2,5) % 生成2×5的零元素数组或矩阵x x = 0 0 0 0 0 0 0 0 0 0 >> x(:)=1:10 % 对2×5的x重新赋值 x = 1 3 5 7 9 2 4 6 8 10 >> a=x(2,4) % 第2行第4列的值赋给a a = 8 >> b=x(8) % 存储中第8位的存储值赋给b b = 8 >> c=x(:,[1,3]) % 第1列与第3列的值赋给c

第29页:例3-17(续)冒号与end的使用

>> d=x([1,2,5,6]') % 第1、2、5、6存储位置的元素按列排列 c = 1 5 2 6 d = 1 2 5 6 >> x(:,4:end) % 显示第4列到最后一列的值 ans = 7 9 8 10 >> x(2,1:2:5)=[-1,3,5] % 对第2行的1、3、5列重新赋值 x = 1 3 5 7 9 -1 4 3 8 5

第30页:例3-17(续)数组重组与逻辑索引赋值

>> y=x([1,2,1,2],[1,3,5]) % 按所选的行列重组数组 y = 1 5 9 2 6 10 1 5 9 2 6 10 >> n=x<3 % 选出数组中小于3的数 >> x(n)=100 % 对其重新赋值 n = 1 0 0 0 0 1 0 0 0 0 x = 100 3 5 7 9 100 4 6 8 10

(2)多维数组的操作运算:介绍数组操作函数 reshape、diag、repmat 的用法以及空 [ ] 删除子数组的用法。一般来说可用于数组的运算也可以用于矩阵。

第31页:例3-18 数组构作技法

例3-18:数组构作技法。

>> a=-4:4 % 设定一维数组 a = -4 -3 -2 -1 0 1 2 3 4 >> A=reshape(a,3,3) % 设定数组展现形式3×3 A = -4 -1 2 -3 0 3 -2 1 4 >> z=diag(y2) % 将对角数组赋予z z = 1 4 >> Z=diag(z) % 以对角数组建立数组 Z = 1 0 0 4 >> D=repmat(Z,2,3) % 对Z数组构建为D数组

第32页:例3-18(续)repmat与空行删除

D = 1 0 1 0 1 0 0 4 0 4 0 4 1 0 1 0 1 0 0 4 0 4 0 4 >> D([1,3],:)=[ ] % 将数组D的第一行与第三行置为空,剩下2、4行元素 D = 0 4 0 4 0 4 0 4 0 4 0 4

在C或Pascal之类的通用算法语言中,要使数组动态增加或减少某些维的长度是很困难的;在MATLAB中的数组下标很灵活,可以进行维间的合并和扩展、维内的抽取和扩展,且对用户而言是简单的。

例3-19:多维数组维内的抽取。

第33页:例3-19 多维数组维内的抽取

>> x(:,:,1)=[1,2;3,4]; x(:,:,2)=[5,6;7,8]; >> x([2,1,1],:,:) % 以第一维中的元素抽取出来重新排列 ans(:,:,1) = 3 4 / 1 2 / 1 2 ans(:,:,2) = 7 8 / 5 6 / 5 6 >> x(:,[1,2,1,2],:) % 以第二维元素抽取出来排列 ans(:,:,1) = 1 2 1 2 / 3 4 3 4 ans(:,:,2) = 5 6 5 6 / 7 8 7 8

第34页:例3-20 多维数组维内的扩展

例3-20:多维数组维内的扩展。

>> x(:,:,1)=[1,2;3,4]; x(:,:,2)=[5,6;7,8]; >> x(3,:,:)=[9,10;11,12] % 在第一维(行)扩展,扩展只能在维末进行 x(:,:,1) = 1 2 / 3 4 / 9 11 x(:,:,2) = 5 6 / 7 8 / 10 12 >> x(3,:,:)=[] % 在第一维删除一行,可以删除该维的中间部分 x(:,:,1) = 1 2 / 3 4

第35页:多维数组维间处理函数

x(:,:,2) = 5 6 / 7 8

多维数组维间处理函数,主要介绍 reshape、size、ndims、cat、permute、ipermute、shiftdim、squeeze 函数在多维数组中的应用。

  • reshape 函数将数据从一种空间形式转换为另一种,前提是这两个空间要能够匹配,所表示的点一样多
  • size(a) 表示矩阵每个维度的长度,size(a,n) 表示矩阵a在第n个维度下的长度
  • length(a) 表示矩阵a的最大长度,即 max(size(a));ndims(a) 表示矩阵a的维数,即 length(size(a))
  • cat 函数连接两个或多个多维数组,但只能在一个维上连接,其余各维的尺寸必须一致

第36页:3.2.2 非数NaN的定义

3.2.2 「非数」和「空」数组

非数NaN
MATLAB规定,形如 0/0、inf/inf、0*inf 等运算都会产生非数(Not a Number),非数在MATLAB中用 NaN 或 nan 表示。

根据IEEE数学规定,NaN具有以下性质:

  • 只要NaN参加四则运算或函数作用于非数,其结果也一定是非数,即具有传递性
  • 非数没有大小的概念,因此不能进行逻辑运算也不能比较两个非数的大小

例3-23:非数的产生与性质。

>> 0/0 % 非数的产生 Warning: Divide by zero ans = NaN

第37页:例3-23 非数的产生与传递性

>> b=0*log(0) Warning: Log of zero b = NaN >> c=inf/inf c = NaN >> d=sqrt(NaN) d = NaN >> a=NaN; % 非数的传递性 >> 0*a ans = NaN >> a==NaN % 非数不能比较 ans = 0

第38页:例3-23(续)非数的判断

>> a~=nan % 非数不能进行逻辑关系运算,也不能给出正确的判断结果 ans = 1 >> a==b ans = 0 >> class(a) % 数据类型归属 ans = double >> isnan(a) % 该指令是惟一能正确判断非数的指令 ans = 1

从结果中可以看出在MATLAB中非数也是一个数,数据类型的输出说明非数是一个双精度的数。

第39页:3.3.1 直接输入创建矩阵

3.3 矩阵代数(英文名Matrix):在数学名词中,矩阵用来表示统计数据等方面的各种有关联的数据。

3.3.1 矩阵的创建 1.直接输入创建矩阵:输入方法是先键入左方括弧「[」,然后按行直接键入矩阵的所有元素,最后键入右方括弧「]」。

  • 整个矩阵以「[」和「]」作为首尾
  • 同行的元素用「,」或空格隔开
  • 不同行的元素用「;」或按Enter键来分隔
  • 矩阵的元素可以为数字也可以为表达式,如果进行数值计算,表达式中不可包含未知的变量

第40页:例3-25 直接输入创建矩阵

例3-25:直接输入创建矩阵。

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

或用MATLAB命令:

>> A=[1,2,3 % 按Enter键 4,5,6 % 按Enter键 7,8,9] % 按Enter键 A = 1 2 3 4 5 6 7 8 9

2.利用MATLAB编辑器建立矩阵:对于比较大且比较复杂的矩阵,可以通过workspace中数组编辑器创建数组,其步骤如下。

第41页:利用数组编辑器建立矩阵

  1. 在workspace小窗口中选择「new variable」,新建数组或矩阵名;也可以在MATLAB编辑窗口中选择file菜单中new子菜单下面的「variable」命令,对新建的数组或矩阵命名
  2. 打开命名好的数据数组或矩阵,把输入的内容输入并存盘,例如如图3-1所示
  3. 一般数据或矩阵命名后缀名为「.mat」,使用MATLAB可以打开编辑或修改其中的内容;当然一些矩阵可以在M文件运行的过程中运用相关的命令进行建立保存

关于M文件后面章节要有详细介绍,这里不再展开叙述。

第42页:表3-1 常用的矩阵函数(一)

3.用矩阵函数来生成矩阵:常见的特殊矩阵有零矩阵、幺矩阵、单位矩阵、三角形矩阵等;还有一类特殊矩阵在专门学科中有用,如有名的希尔伯特(Hilbert)矩阵、范德蒙(Vandermonde)矩阵等。表3-1给出MATLAB常用的矩阵函数。

常用的矩阵函数(一)
功能函数名称
求矩阵A的特征值eig(A)
m行n列的零矩阵zeros(m,n)
求矩阵A的特征多项式poly(A)
n阶单位矩阵eye(n)
求矩阵A的迹trace(A)
m行n列的元素为1的矩阵ones(m,n)

说明:源文件中零矩阵函数写作 zero(m,n),MATLAB标准写法为 zeros(m,n);eye(n) 的功能在源文件中写作「n阶方矩阵」,按单位矩阵定义规范为「n阶单位矩阵」。

第43页:表3-1 常用的矩阵函数(二)

下表续列常用的矩阵函数。

常用的矩阵函数(二)
功能函数名称
求矩阵A的条件数cond(A)
m行n列的随机矩阵rand(m,n)
求矩阵A的行最简形rref(A)
m行n列的正态随机矩阵randn(m,n)
求矩阵A的逆矩阵inv(A)
n阶魔方矩阵magic(n)
求矩阵A的行列式det(A)
海森伯格矩阵hess(A)
求矩阵A的指数值expm(A)
求矩阵A的平方根sqrtm(A)
求矩阵A的对数值logm(A)
按矩阵计算的函数值funm(A)
求矩阵A的范数norm(A,1)
求矩阵A的秩rank(A)

说明:源文件中求范数的函数写作 morm(A,1),MATLAB标准写法为 norm(A,1),此处按标准写法列出。

第44页:零矩阵、幺矩阵与单位矩阵

下面将运用这些矩阵函数建立矩阵。

零矩阵
所有元素值为零的矩阵,用 zeros 函数实现:zeros(m) 产生m×m阶零矩阵;zeros(m,n) 产生m×n阶零矩阵,当m=n时等同于zeros(m);zeros(size(A)) 产生与矩阵A同样大小的零矩阵。
幺矩阵
所有元素值为1的矩阵,用 ones 函数实现,调用格式与 zeros 函数一样。
单位矩阵
主对角线元素值为1、其余元素值为0的矩阵,用内部函数 eye 建立,使用格式与 zeros 相同。
数量矩阵
主对角线元素值为一常数d、其余元素值为0的矩阵;当d=1时即为单位矩阵,故可用 eye(m)*d 或 eye(m,n)*d 建立。
对角阵
对角线元素值为常数、其余元素值为0的矩阵,可通过内部函数 diag 利用向量构成对角阵,或从矩阵中提取某对角线构成向量,使用格式为 diag(V) 和 diag(V,k)。

第45页:ones、zeros、magic生成实例

>> ones(2,3) % 一个2×3阶幺阵 ans = 1 1 1 1 1 1 >> zeros(2,3) % 生成元素都为0的2行3列零矩阵 ans = 0 0 0 0 0 0 >> magic(3) % 生成3阶魔方矩阵 ans = 8 1 6 3 5 7 4 9 2

当用一个向量构成一个对角阵:设 V 为具有 m 个元素的向量,diag(V) 将产生一个 m×m 阶对角阵,其主对角线的元素值即为向量的元素值;diag(V,k) 将产生一个 n×n(n=m+|k|,k为一整数)阶对角阵,其第k条对角线的元素值即为向量的元素值。

第46页:diag函数构成对角阵实例

>> v =[1;2;3]; % 建立一个已知的向量 >> A=diag(v); B=diag(v,1); C=diag(v,-1) A = 1 0 0 / 0 2 0 / 0 0 3 B = 0 1 0 0 / 0 0 2 0 / 0 0 0 3 / 0 0 0 0 C = 0 0 0 0 / 1 0 0 0 / 0 2 0 0 / 0 0 3 0

注意:当 k>0,则该对角线位于主对角线的上方第k条;当 k<0,该对角线位于主对角线的下方第|k|条;当 k=0,则等同于 diag(V)。用 diag 建立的对角阵必是方阵。

第47页:从矩阵提取对角线构成向量

已知矩阵A,试从矩阵A分别提取主对角线及它两侧的对角线构成向量B、C和D。MATLAB程序如下。

>> A=[1 2 3;4 5 6]; % 建立一个已知的2×3阶矩阵A >> B=diag(A) % 按各种对角线情况构成向量B、C和D >> C=diag(A,1) >> D=diag(A,-1) B = 1 5 C = 2 6 D = 4

上三角阵与下三角阵:上三角阵使用格式为 triu(A)、triu(A,k),下三角阵使用格式为 tril(A)、tril(A,k)。

第48页:triu函数提取上三角阵

试分别用 triu(A)、triu(A,1) 和 triu(A,-1) 从矩阵A提取相应的上三角部分构成上三角阵B、C和D。MATLAB程序如下。

>> A=[1 2 3;4 5 6;7 8 9]; % 一个已知的3×3阶矩阵A >> B=triu(A); C=triu(A,1); D=triu(A,-1) B = 1 2 3 / 0 5 6 / 0 0 9 C = 0 2 3 / 0 0 6 / 0 0 0 D = 1 2 3 / 4 5 6 / 0 8 9

注意:这里的 k 与 diag(A,k) 的用法类似,当 k>0,该对角线位于主对角线的上方第k条;当 k<0,位于主对角线的下方第|k|条;当 k=0,则等同于 triu(A)。

第49页:空矩阵

空矩阵:在MATLAB里,把行数、列数为零的矩阵定义为空矩阵。空矩阵在数学意义上讲是空的,但在MATLAB里确是很有用的。例如:

>> A=[1 2 3;4 5 6]; >> B=find(A>7) B = Empty matrix: 0-by-1 >> C = [ ] C = []

这里 [ ] 是空矩阵的符号,B=find(A>7) 表示列出矩阵A中值大于7的元素的序号,当不能满足括号中的条件时返回空矩阵,也可以将空矩阵赋给一个变量。

第50页:3.3.2 行列式的值与秩

3.3.2 矩阵的操作 1.行列式的值:MATLAB提供的内部函数 det 用来计算矩阵的行列式的值。设矩阵A为一方阵(必须是方阵),求其行列式值的格式为 det(A);求矩阵A的秩格式为 rank(A)。

例3-27:计算方阵之行列式的值。

>> A=[1 2 3;4 5 6;7 8 9]; % 一个已知的3×3阶矩阵A >> det(A) ans = 0 >> B=[1 2 3;4 5 6;1 2 1]; >> det(B) ans = 6

第51页:特征值与特征向量

对一般的N×N阶方阵A,其特征值通常为复数,若A为实对称矩阵,则A的特征值为实数。MATLAB提供的内部函数 eig 可以用来计算特征值与特征向量,eig函数的使用格式有五种。

  • E=eig(A):求矩阵A的全部特征值,构成向量E
  • [V,D]=eig(A):求矩阵A的全部特征值构成对角阵D,并求A的特征向量构成V的列向量
  • [V,D]=eig(A,'nobalance'):与第2种格式类似,但不先对A作相似变换,直接求特征值和特征向量
  • E=eig(A,B):返回N×N阶方阵A和B的N个广义特征值,构成向量E
  • [V,D]=eig(A,B):返回方阵A和B的N个广义特征值构成对角阵D,同时返回相应特征向量构成满秩矩阵,满足 AV=BVD

第52页:例3-28 求特征值与特征向量

例3-28:求下列矩阵的特征值相应的特征向量。

>> B=[4 4 2;4 4 1;2 1 8]; >> eig(B) ans = -0.0666 5.9205 10.1461

矩阵 A=[9 1 2;5 6 3;8 2 7],对A进行特征值分解。

>> [v,d]=eig(A,B) v = -0.4330 -0.2543 -0.1744 -0.5657 0.9660 -0.6091 -0.7018 0.0472 0.7736 d = 13.5482 0 0 0 4.8303 0 0 0 3.6216

第53页:矩阵元素的表示与操作

3.对矩阵元素的操作 操作符冒号「:」的应用说明:A(i:j) 表示 A(i)、A(i+1)、…、A(j)。设A是一个矩阵,则在MATLAB中有如下符号表示它的元素。

A(i,j)
矩阵A的第i行第j列元素
A(:,j)
矩阵A的第j列
A(i,:)
矩阵A的第i行
A(:,:)
A的所有元素构造2维矩阵
A(:)
以矩阵A的所有元素按列做成的一个列矩阵
A(i)
矩阵A(:)的第i个元素
[ ]
空矩阵

例3-29:矩阵操作相关算例。

>> A=[1 2 3;sin(3) 7 8;log(2) 6 1]; % 输入矩阵A >> a=A(2,3) % 求第2行第3列元素 >> b=A(4) % 求第4个元素 >> c=A(2:4) % 取A(2)、A(3)、A(4) >> d=A(1,:) % 取第1行 >> A(2,1)=100 % 把第2行第1列元素修改为100

第54页:例3-29 矩阵操作结果

A = 1.0000 2.0000 3.0000 0.1411 7.0000 8.0000 0.6931 6.0000 1.0000 a = 8 b = 2 c = 0.1411 0.6931 2.0000 d = 1 2 3 A = 1.0000 2.0000 3.0000 100.0000 7.0000 8.0000 0.6931 6.0000 1.0000

第55页:矩阵的扩充与分块合成

>> A=[1,2;3,4]; % 输入矩阵A >> C= A; % 将矩阵A赋予矩阵C >> C(1,3)=5 % 把矩阵A扩充为1行3列矩阵 >> B=[A,C] % 由矩阵A与C合成矩阵B >> D=[A,zeros(2,3);ones(2), C] % 由矩阵A与B合成分块矩阵D C = 1 2 5 / 3 4 0 B = 1 2 1 2 5 / 3 4 3 4 0 D = 1 2 0 0 0 / 3 4 0 0 0 / 1 1 1 2 5 / 1 1 3 4 0 >> A=[1 2 3;sin(3) 7 8;cos(2)+pi 6 1]; % 输入矩阵A

第56页:4.矩阵的运算

>> A(1,:)=[] % 删除矩阵A的第一行 A = 0.1411 7.0000 8.0000 2.7254 6.0000 1.0000

一维数组相当于向量,二维数组相当于矩阵,所以矩阵是数组的子集。数组运算是指数组对应元素之间的运算,也称点运算。矩阵的乘法、乘方和除法有特殊的数学含义,并不是数组对应元素的运算,所以数组乘法、乘方和除法的运算符前特别加了一个点。矩阵是一个二维数组,所以矩阵的加、减、数乘等运算与数组运算是一致的。

第57页:数组运算的运算符规则

例3-30:矩阵的运算示例。

>> a=[6 9 3;2 7 5]; >> b=[2 4 1;4 6 8]; >> a.*b ans = 12 36 3 8 42 40

数组运算

  • 转置 A.' 非共轭转置,相当于 (conj(A'))
  • 数组加与减 A+B 与 A-B 表示对应元素之间加减
  • 数乘数组 k.*A 或 A.*k 表示k乘A的每个元素
  • 数与数组加减 k+A 与 k-A 表示k加(减)A的每个元素
  • 不加点就是矩阵之间的乘法,需符合行列要求;加点叫做点乘,是对应元素之间相乘

第58页:矩阵运算与数组运算对比

  • 数组乘数组 A.*B 表示对应元素之间相乘
  • 数组乘方 A.^k 表示A的每个元素进行k次方运算;k.^A 表示以k为底、以A的元素为指数求幂值
  • k./A 和 A.\k 分别表示k被A的元素除以及数组A除以k
  • 数组除法有左除 A.\B 和右除 B./A

矩阵运算

  • 矩阵转置用 transpose(A) 或 A' 来实现
  • 矩阵加减 A+B 和 A-B;数乘矩阵 k*A 或 A*k(以上三项同数组运算相同)
  • 矩阵乘法 A*B 按数学定义的矩阵乘法规则;矩阵乘方 A^k 表示k个矩阵A相乘
  • 数与矩阵加减 k+A 与 k-A 等价于 k*ones(size(A))+(-)A
  • 矩阵除法有左除 A\B 与右除 B/A,分别为 AX=B 和 XA=B 的解
>> A=[1 2;3 4]; B=[4 3;2 1]; >> r=100+A; C=A' r = 101 102 / 103 104 C = 1 3 / 2 4

第59页:例3-30 矩阵运算命令一览

>> r1=A*B; r2=A.*B; r3=A\B; r4=A.\B; >> r5=B/A; r6=B./A; r7=A.^2; r8=A^2; r9=2.^A; r10=2^A r1 = 8 5 / 20 13 r2 = 4 6 / 6 4 r3 = -6.0000 -5.0000 / 5.0000 4.0000

第60页:例3-30 运算结果(续)

r4 = 4.0000 1.5000 / 0.6667 0.2500 r5 = -3.5000 2.5000 / -2.5000 1.5000 r6 = 4.0000 1.5000 / 0.6667 0.2500 r7 = 1 4 / 9 16 r8 = 7 10 / 15 22 r9 = 2 4 / 8 16

第61页:例3-31 数组平方与矩阵平方

r10 = 10.4827 14.1519 / 21.2278 31.7106

例3-31:分别计算a的数组平方和矩阵平方,并观察其结果。

>> a=[1 2 3;4 5 6;7 8 9]; >> a.^2 ans = 1 4 9 / 16 25 36 / 49 64 81 >> a^2 ans = 30 36 42 / 66 81 96 / 102 126 150

第62页:例3-32 flipud、fliplr、rot90

5. flipud、fliplr、rot90 函数 例3-32:下面显示利用函数 flipud、fliplr、rot90 修改数值矩阵的方法。

>> A=reshape(1:9,3,3) A = 1 4 7 / 2 5 8 / 3 6 9 >> B=flipud(A) % 对矩阵行向量重置,将原来的行进行逆排序 B = 3 6 9 / 2 5 8 / 1 4 7 >> C=fliplr(A) % 对矩阵列向量重置,将原来的列进行逆排序

第63页:3.3.3 逆矩阵与可逆条件

3.3.3 线性方程组求解与矩阵分解

C = 7 4 1 / 8 5 2 / 9 6 3 >> D=rot90(A,2) % 旋转90度显示矩阵 D = 9 6 3 / 8 5 2 / 7 4 1

若方阵A、B满足等式 A*B=B*A=I(I为单位矩阵),则称A为B的逆矩阵,或称B为A的逆矩阵。这时A、B都称为可逆矩阵(或非奇异矩阵、或满秩矩阵),否则称为不可逆矩阵(或奇异矩阵、或降秩矩阵)。

第64页:例3-33 线性方程组求解

例3-33:求下列三阶线性代数方程组的近似解。

>> A=[2 -5 4;1 5 -2;-1 2 4] A = 2 -5 4 1 5 -2 -1 2 4 >> b=[5;6;5] b = 5 6 5 >> x=A\b x = 2.7674 1.1860 1.3488

在MATLAB命令窗口,先构造系数矩阵A和右端向量b,然后只需输入命令 x=A\b 即可求得解x。

第65页:1.LU分解

矩阵分解函数 1.LU分解

  • [L,U]=lu(X):产生一个上三角矩阵U和一个下三角矩阵L,使得 X=L*U
  • [L,U,P]=lu(X):产生上三角矩阵U、下三角矩阵L以及置换矩阵P,使得 P*X=L*U(注意:X必须是方阵)

例3-38:用lu分解的两种指令格式对矩阵A进行LU分解。

>> A=[1 -1 1; 5 -4 3; 2 1 1] A = 1 -1 1 5 -4 3 2 1 1 >> [L,U]=lu(A)

第66页:例3-38 LU分解结果

L = 0.2000 -0.0769 1.0000 1.0000 0 0 0.4000 1.0000 0 U = 5.0000 -4.0000 3.0000 0 2.6000 -0.2000 0 0 0.3846 >> [L,U,P]=lu(A) L = 1.0000 0 0 0.4000 1.0000 0 0.2000 -0.0769 1.0000 U = 5.0000 -4.0000 3.0000 0 2.6000 -0.2000 0 0 0.3846

第67页:2.QR分解

P = 0 1 0 / 0 0 1 / 1 0 0

2.QR分解

  • [Q,R]=qr(A):产生一个与矩阵A相同维数的上三角矩阵R和一个酉阵Q,使得 A=Q*R
  • [Q,R,E]=qr(A):产生一个置换矩阵E、上三角矩阵R和一个酉阵Q,使得 A*E=Q*R

例3-41:对矩阵a进行QR分解。

>> a=[1 -1 1;5 -4 3;2 1 1] a = 1 -1 1 5 -4 3 2 1 1 >> [Q,R]=qr(a)

第68页:例3-41 QR分解结果

Q = -0.1826 -0.1501 -0.9717 -0.9129 -0.3412 0.2242 -0.3651 0.9279 -0.0747 R = -5.4772 3.4689 -3.2863 0 2.4427 -0.2456 0 0 -0.3737 >> [Q,R,E]=qr(a) Q = -0.1826 -0.1501 -0.9717 -0.9129 -0.3412 0.2242 -0.3651 0.9279 -0.0747 R = -5.4772 3.4689 -3.2863 0 2.4427 -0.2456 0 0 -0.3737

第69页:3.Cholesky分解

E = 1 0 0 / 0 1 0 / 0 0 1

3.Cholesky分解:Cholesky分解要求被分解矩阵为对称正定矩阵,R=chol(A) 产生一个上三角矩阵R。

例3-43:对矩阵a进行Cholesky分解。

>> a=[2,1,1;1,2,-1;1,-1,3] a = 2 1 1 1 2 -1 1 -1 3 >> R=chol(a) R = 1.4142 0.7071 0.7071 0 1.2247 -1.2247 0 0 1.0000

第70页:3.4.1 多项式求根

3.4 多项式运算:鉴于MATLAB无零下标,故把多项式的一般形式表达为按降幂排列的系数向量。

3.4.1 多项式求根 多项式求根命令格式:x=roots(A)。这里A为多项式的系数 A(1)、A(2)、…、A(N)、A(N+1);解得的根赋值给数组X,即 X(1)、X(2)、…、X(N)。

例3-44:求方程的全部根。

>> p=[3,7,9,0,-23]; % 建立多项式系数向量 >> x=roots(p) % 求根

第71页:3.4.2 多项式的建立

例3-45:求方程的全部根。在MATLAB命令窗口输入:

>> p=[1,7,0,9,-20]; % 建立多项式系数向量 >> x=roots(p) % 求根 x = -7.2254 -0.4286 + 1.5405i -0.4286 - 1.5405i 1.0826

3.4.2 多项式的建立:若已知多项式的全部根,则可以用 POLY 函数建立起该多项式;也可以用 POLY 函数求矩阵的特征多项式。调用命令格式是 A=poly(x)。

第72页:3.4.3 多项式求解

若x为具有N个元素的向量,则 poly(x) 建立以x为其根的多项式,并将该多项式的系数赋值给向量A,此种情况下 POLY 与 ROOTS 互为逆函数;若x为N×N的矩阵,则 poly(x) 返回一个向量赋值给A,该向量的元素为矩阵x的特征多项式之系数。

例3-46:已知 f(x),(1) 计算 f(x)=0 的全部根;(2) 由方程 f(x)=0 的根构造一个多项式 g(x),并与 f(x) 对比。命令如下。

>> P=[3,0,4,-5,-7.2,5]; >> X=roots(P) % 求方程f(x)=0的根 >> G=poly(X) % 求多项式g(x)

POLYVAL 函数用来求代数多项式的值,调用的命令格式为 Y=polyval(A,x)。

第73页:例3-47 polyval求多项式的值

本命令将 POLYVAL 函数返回的多项式的值赋值给Y。若x为一数值,则Y也为一数值;若x为向量或矩阵,则对向量或矩阵中的每个元素求其多项式的值。

例3-47:设定多项式,其中x分别取 x=2 和矩阵的2×3个元素为自变量计算该多项式的值。

>> A=[1 8 0 0 -10]; % 4次多项式系数 >> x=2; % 取自变量为一数值 >> y1=polyval(A,x) y1 = 70 >> x=[-1 1.2 -1.5;3 3.5 6] % 给出一个矩阵x x = -1.0000 1.2000 -1.5000 3.0000 3.5000 6.0000 >> y2=polyval(A,x)

第74页:3.4.4 多项式的加减与乘法

y2 = 1.0e+003 * -0.0170 0.0059 -0.0319 0.2870 0.4831 3.0140

3.4.4 多项式的四则运算 1.多项式加、减:对于次数相同的若干个多项式,可直接对多项式系数向量进行加、减运算;如果多项式的次数不同,则应把低次多项式系数不足的高次项用零补足,使同式中的各多项式具有相同的次数。

2.多项式乘法:若A、B是由多项式系数组成的向量,则 CONV 函数将返回这两个多项式的乘积,调用命令格式为 C=conv(A,B)。

第75页:例3-48 多项式乘法

命令的结果C为一个向量,由它构成一个多项式。

例3-48:求两个多项式的乘积。

>> A=[1 7 0 0 -5]; B=[3 -1 3]; >> C=conv(A,B) C = 3 20 -4 21 -15 5 -15

运行结果是求得一个6次多项式。

3.多项式除法:当A、B是由多项式系数组成的向量时,DECONV 函数用来对两个多项式作除法运算,调用的命令格式为 [Q,r]=deconv(A,B)。

第76页:例3-49 多项式除法

本命令的结果:多项式A除以多项式B获商多项式赋予Q(也为多项式系数向量),获余项多项式赋予r(其系数向量的长度与被除多项式相同,通常高次项的系数为0)。DECONV 是 CONV 的逆函数,即有 A=conv(B,Q)+r。

例3-49:两个多项式相除。

>> A=[1 7 0 0 -5]; B=[3 -1 3]; >> [P,r]=deconv(A,B) P = 0.3333 2.4444 0.4815 r = 0 0.0000 0.0000 -6.8519 -6.4444

第77页:本章小结

本章小结

  • 首先介绍了数组的不同创建与操作方法
  • 介绍了MATLAB中「非数」与「空」数组的概念以及使用方法
  • 然后介绍了矩阵的创建与操作,以及矩阵在线性代数中的应用
  • 最后介绍了多项式相关运算

第78页:谢谢

谢谢!——第3章 数组与矩阵操作 内容到此结束。

顶部目录