页数:78页文件大小:265.7 KB来源: MATLAB基础与应用ppt课件
本课件系统讲解MATLAB中数组与矩阵的操作方法:先介绍一维、二维及高维数组的创建与寻访,再讲解矩阵的算术、关系与逻辑运算,随后展开多项式求值求根、稀疏矩阵存储与矩阵分析函数,并汇总常用特殊矩阵的生成方式。
本页为《MATLAB基础与应用》第3章 数组与矩阵操作的章节封面。
学习目地
本章知识结构:数组与矩阵的操作分为四大板块。
3.1.1 一维数组创建:在MATLAB中数组就是一行或者一列的矩阵,对矩阵的输入、修改、保存都适用于数组,MATLAB还提供了一些创建数组的特殊指令,数组创建方法不是单一的。下面介绍常用的数组创建方法。
一维数组常用的创建方法
[a,b,c,d] 或 [a b c d],元素之间可用逗号或空格隔开[a;b;c;d],元素之间用分号隔开(分号必须是英文输入格式)y=j:i:k 表示从j到k步长为i的等差数组,i默认为1y=linspace(start_num,stop_num,n),在首元素start_num与末元素stop_num之间共生成n个元素,不指定n时默认为100y=logspace(start_num,stop_num,n),生成从10start_num到10stop_num之间按对数等分的n个元素例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:0d = 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允许构造多维数组,多维数组元素有多个下标,也称为多下标变量。本小节介绍二维数组的创建方法。
例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指令窗被关闭为止。
例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单位数组以向量 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 1x = 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对于一个数组、矩阵或行列式,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对于多维的数组,把第二维以后的维数作为数据平面(plane)来看,存放的顺序是:第一个plane(也可叫做层)中的矩阵,第二个plane中的矩阵……且每一个plane中的数组存放顺序是第一列单元、第二列单元,…最后一列。
例3-5:设定一个多维数组。
>> x=[1,2;3,4]; x(:,:,2)=[5,6;7,8] x(:,:,1) = 1 2 3 4x(:,:,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。
例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例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 33.1.4 字符数组:用来存放字符量的数组称为字符数组,字符数组类型说明的形式与数值数组相同。
例3-8:字符串数组示例。
>> D=strvcat('Hello','Yes','No','Goodbye') % 用串操作函数创建串数组 D = Hello Yes No Goodbye由于字符串相关操作在前面已经介绍过,本节不再对字符数组的操作展开叙述。
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>> 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.00002.MATLAB在基本统计处理功能(1)取最大值、最小值与求中值:MAX函数用来查取数据序列的最大值。
[Y,I]=max(X):返回矩阵X的各列中的最大元素值及其位置赋予行向量Y与I;X为向量时,Y与I为单变量[Y,I]=max(X,[],DIM):按数组X的第DIM维的方向查取最大元素值及其位置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] 统一,结果以定义式为准。
>> [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的二维数组所有同一位置上的元素值大者构成一个新矩阵。
>> 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为单变量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>> 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按行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>> 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>> y2= prod(x,2) y2 = 120 6(3)求累计和、累积积、标准方差与升序排序:MATLAB提供的函数分别为 CUMSUM、CUMPROD、STD 和 SORT,这里仅 STD 函数为MATLAB程序,其余均为内部函数,其调用参数与操作方式都与 MEDIAN 函数基本一样。
3.对数组的操作运算 (1)二维数组的操作运算:在数组中「:」代表任意维数的值,比如任意行或列;「end」代表维数中最后位的值。
例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>> 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>> 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 的用法以及空 [ ] 删除子数组的用法。一般来说可用于数组的运算也可以用于矩阵。
例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数组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:多维数组维内的抽取。
>> 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例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 4x(:,:,2) = 5 6 / 7 8多维数组维间处理函数,主要介绍 reshape、size、ndims、cat、permute、ipermute、shiftdim、squeeze 函数在多维数组中的应用。
3.2.2 「非数」和「空」数组
根据IEEE数学规定,NaN具有以下性质:
例3-23:非数的产生与性质。
>> 0/0 % 非数的产生 Warning: Divide by zero ans = NaN>> 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>> a~=nan % 非数不能进行逻辑关系运算,也不能给出正确的判断结果 ans = 1 >> a==b ans = 0 >> class(a) % 数据类型归属 ans = double >> isnan(a) % 该指令是惟一能正确判断非数的指令 ans = 1从结果中可以看出在MATLAB中非数也是一个数,数据类型的输出说明非数是一个双精度的数。
3.3 矩阵代数(英文名Matrix):在数学名词中,矩阵用来表示统计数据等方面的各种有关联的数据。
3.3.1 矩阵的创建 1.直接输入创建矩阵:输入方法是先键入左方括弧「[」,然后按行直接键入矩阵的所有元素,最后键入右方括弧「]」。
例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 92.利用MATLAB编辑器建立矩阵:对于比较大且比较复杂的矩阵,可以通过workspace中数组编辑器创建数组,其步骤如下。
关于M文件后面章节要有详细介绍,这里不再展开叙述。
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阶单位矩阵」。
下表续列常用的矩阵函数。
| 功能 | 函数名称 |
|---|---|
| 求矩阵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),此处按标准写法列出。
下面将运用这些矩阵函数建立矩阵。
>> 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条对角线的元素值即为向量的元素值。
>> 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 建立的对角阵必是方阵。
已知矩阵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)。
试分别用 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)。
空矩阵:在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的元素的序号,当不能满足括号中的条件时返回空矩阵,也可以将空矩阵赋给一个变量。
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对一般的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例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.62163.对矩阵元素的操作 操作符冒号「:」的应用说明:A(i:j) 表示 A(i)、A(i+1)、…、A(j)。设A是一个矩阵,则在MATLAB中有如下符号表示它的元素。
例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列元素修改为100A = 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>> 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>> A(1,:)=[] % 删除矩阵A的第一行 A = 0.1411 7.0000 8.0000 2.7254 6.0000 1.0000一维数组相当于向量,二维数组相当于矩阵,所以矩阵是数组的子集。数组运算是指数组对应元素之间的运算,也称点运算。矩阵的乘法、乘方和除法有特殊的数学含义,并不是数组对应元素的运算,所以数组乘法、乘方和除法的运算符前特别加了一个点。矩阵是一个二维数组,所以矩阵的加、减、数乘等运算与数组运算是一致的。
例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=[1 2;3 4]; B=[4 3;2 1]; >> r=100+A; C=A' r = 101 102 / 103 104 C = 1 3 / 2 4>> 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.0000r4 = 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 16r10 = 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 1505. 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) % 对矩阵列向量重置,将原来的列进行逆排序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都称为可逆矩阵(或非奇异矩阵、或满秩矩阵),否则称为不可逆矩阵(或奇异矩阵、或降秩矩阵)。
例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。
矩阵分解函数 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)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.3846P = 0 1 0 / 0 0 1 / 1 0 02.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)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.3737E = 1 0 0 / 0 1 0 / 0 0 13.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.00003.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) % 求根例3-45:求方程的全部根。在MATLAB命令窗口输入:
>> p=[1,7,0,9,-20]; % 建立多项式系数向量 >> x=roots(p) % 求根 x = -7.2254 -0.4286 + 1.5405i -0.4286 - 1.5405i 1.08263.4.2 多项式的建立:若已知多项式的全部根,则可以用 POLY 函数建立起该多项式;也可以用 POLY 函数求矩阵的特征多项式。调用命令格式是 A=poly(x)。
若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)。
本命令将 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)y2 = 1.0e+003 * -0.0170 0.0059 -0.0319 0.2870 0.4831 3.01403.4.4 多项式的四则运算 1.多项式加、减:对于次数相同的若干个多项式,可直接对多项式系数向量进行加、减运算;如果多项式的次数不同,则应把低次多项式系数不足的高次项用零补足,使同式中的各多项式具有相同的次数。
2.多项式乘法:若A、B是由多项式系数组成的向量,则 CONV 函数将返回这两个多项式的乘积,调用命令格式为 C=conv(A,B)。
命令的结果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)。
本命令的结果:多项式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本章小结
谢谢!——第3章 数组与矩阵操作 内容到此结束。
下载地址:{{downurl}}
{{{a}}}
{{#b}}{{{b}}}
{{/b}} {{/title}} {{#nolog}}登陆注册
{{/nolog}} {{#djsx}}点我刷新
{{/djsx}} {{#gocz}} {{/gocz}} {{#ffqr}} {{/ffqr}}