Matlab矩阵的生成与操作安徽工业大学数理学院侯为根wghou@ahut.edu.cn【例1-1】表示矩阵一、MATLAB矩阵的生成1、直接输入法将矩阵的元素用方括号括起来,按矩阵行的顺序输入各元素,同一行的各元素之间用空格或逗号分隔,不同行的元素之间用分号分隔。A=[1,2,3;4,5,6;7,8,0]A=[1,2,3;45,6;7,80]087654321A【例1-2】试输入复数矩阵需要避免的语句B=[1+9*i,2+8*i,3+7*j;4+6*j5+5*i,6+4*i;7+3*i,8+2*i,i]B=[1+9*i,2+8*i,3+7*j;4+6*j5+5*i,6+4*i;7+3*i,8+2*i,i]iiiiiiiiiB28374655647382912、利用M文件建立矩阵对于比较大且比较复杂的矩阵,可以为它专门建立一个M文件。【例1-3】利用M文件建立mymat矩阵。(1)启动有关编辑程序或MATLAB文本编辑器,并输入待建矩阵.(2)把输入的内容以纯文本方式存盘(设文件名为mymat.m)。(3)运行该M文件,就会自动建立一个名为mymat的矩阵,可供以后使用。A=[410162;82947;75715;03454;23131303]3、利用MATLAB函数建立矩阵几个产生特殊矩阵的函数:zeros、ones、eye、rand、randn、pascal、magic(n)、vander(V)、hilb(n)、toeplitz(x,y)、compan(P)。这几个函数的调用格式相似,下面以产生零矩阵的zeros函数为例进行说明。其调用格式是:zeros(m)产生m×m零矩阵zeros(m,n)产生m×n零矩阵。zeros(size(A))产生与矩阵A同样大小的零矩阵相关的函数有:length(A)给出行数和列数中的较大者,即length(A)=max(size(A));ndims(A)给出A的维数。指令说明zeros(m,n)产生阶为m×n,元素全为0的矩阵ones(m,n)产生阶为m×n,元素全为1的矩阵eye(n)产生阶为n×n的单位阵pascal(m,n)产生阶为m×n的Pascal矩阵vander(m,n)产生阶为m×n的Vandermonde矩阵hilb(n)产生阶为n×n的Hilbert矩阵rand(m,n)产生[0,1]均匀分布的随机数矩阵,其阶为m×nrandn(m,n)产生µ=0,=1的正态分布随机数矩阵,其阶为m×nmagic(n)产生阶为n×n的魔方阵diag(v)产生以向量v为对角元素的对角阵【例1-4】分别建立3×3、3×2和与矩阵A同样大小的零矩阵。(1)建立一个3×3零矩阵:zeros(3)(2)建立一个3×2零矩阵:zeros(3,2)(3)建立与矩阵A同样大小零矩阵:zeros(size(A))此外,常用的函数还有reshape(A,m,n),它在矩阵总元素保持不变的前提下,将矩阵A重新排成m×n的二维矩阵。【例1-5】将4阶魔方阵形变为2行8列的矩阵reshaps(magic(4),2,8)hilb(n)指令可以产生n×n的Hilbert矩阵11jiHij•Hilbert矩阵Hilbert矩阵的特性:当矩阵变大时,其矩阵会接近奇异(即矩阵的行列式会接近于0),Hilbert矩阵常被用来评估各种逆矩阵计算方法的稳定性。【例1-6】计算6阶hilbert矩阵的行列式det(hilb(6))x1=rand(10000,1);x2=randn(10000,1);subplot(2,1,1);hist(x1,40);title('均匀分布');subplot(2,1,2);hist(x2,40);title('高斯分布');set(findobj(gcf,'type','patch'),'EdgeColor','w');%改边线为白色【例1-7】产生10000个均匀均匀与正态分布的随机数•产生随机数矩阵指令rand和randn4、建立大矩阵大矩阵可由方括号中的小矩阵建立起来。A=[123;456;780];5、冒号表达式冒号表达式的一般格式:v=s1:s2:s3还可以用linspace函数产生行向量:linspace(a,b,n)linspace(a,b,n)与a:(b-a)/(n-1):b等价C=[A,eye(size(A));ones(size(A)),A]A=[[A;[123]];[1;2;3;4]];【例1-8】使用小矩阵构造大矩阵【例1-9】用不同的步距生成(0,p)间向量V1=0:0.2:piV3=0:-1:piV2=0:piV4=pi:-1:0V5=[0:0.2:pi,pi]V7=0:pi/100:piV6=linspace(0,pi,100)二、对矩阵元素的操作•矩阵A中,位于第i行、第j列的元素可表示为A(i,j)i与j即是此元素的下标(Subscript)或索引(Index)•MATLAB中所有矩阵的内部表示法都是以列为主的一维向量A(i,j)和A(i+(j-1)*m)是完全一样的~m为矩阵A的列数1、矩阵的索引或下标我们可以使用一维或二维下标来存取矩阵A=[410162;82947;75715;03454;23131303]2、矩阵元素•MATLAB允许用户对一个矩阵的单个元素进行赋值和操作。例如A(3,2)=200•也可以采用矩阵元素的序号来引用矩阵元素。矩阵元素按列编号,先第一列,再第二列,依次类推。•以m×n矩阵A为例,矩阵元素A(i,j)的序号为:(j-1)*m+i。其相互转换关系也可利用sub2ind和ind2sub函数求得。3.子矩阵提取(1)利用冒号表达式获得子矩阵①A(:,j)表示取A矩阵的第j列全部元素;A(i,:)表示A矩阵第i行的全部元素;A(i,j)表示取A矩阵第i行、第j列的元素。②A(i:i+m,:)表示取A矩阵第i~i+m行的全部元素;A(:,k:k+m)表示取A矩阵第k~k+m列的全部元素,A(i:i+m,k:k+m)表示取A矩阵第i~i+m行内,并在第k~k+m列中的所有元素。③利用一般向量和end运算符等来表示矩阵下标,从而获得子矩阵。end表示某一维的末尾元素下标。【例2-1】子矩阵提取提取矩阵A全部奇数行,所有列将矩阵A左右翻转提取矩阵A的3,2,1行、2,3,4列构成子矩阵将矩阵A2,4列全变为1B1=A(1:2:end,:)B3=A(:,end:-1:1])B2=A([3,2,1],2:4)A(:,[2,4])=ones(4,2)4、利用空矩阵删除矩阵的元素•在MATLAB中,定义[]为空矩阵。给变量X赋空矩阵的语句为X=[]。【注意】X=[]与clearX不同,clear是将X从工作空间中删除,而空矩阵则存在于工作空间,只是维数为0。将某些元素从矩阵中删除,采用将其置为空矩阵的方法就是一种有效的方法。【例2-2】将矩阵A2,4行删去A([2,3],:]=[]5矩阵翻转左右翻转:上下翻转:旋转90o:如何旋转180o?fliplr(A)flipud(A)rot90(A)rot90(rot90(A))A=[1234;5678;9101112]A1=diag(A)A2=diag(A,1)A3=diag(A,-1)B1=diag(A1,1)B2=diag(A3,1)6选取对角元素7选取上〔下)三角元阵c1=tril(A)c2=tril(A,1)c3=tril(A,-1)d1=triu(A)d2=triu(A,1)D3=triu(A,-1)1、直接创建稀疏矩阵例:S=sparse(i,j,s,m,n)其中i和j分别是矩阵非零元素的行和列指标向量,s是非零元素值向量,m,n分别是矩阵的行数和列数。S2=sparse([122344],[313423],...[533143],4,4)稀疏矩阵的输入与生成2、从文件中创建稀疏矩阵例:设文本文件T.txt中有三列内容,第一列是一些行下标,第二列是列下标,第三列是非零元素值。135213233341424433利用load和spconvert函数可以从包含一系列下标和非零元素的文本文件中输入稀疏矩阵。loadT.txtS=spconvert(T)3、稀疏带状矩阵的创建例:S=spdiags(B,d,m,n)其中m和n分别是矩阵的行数和列数;d是长度为p的整数向量,它指定矩阵S的对角线位置;B是全元素矩阵,用来给定S对角线位置上的元素,行数为min(m,n),列数为p。B=rand(4,2);S3=spdiags(B,[01],4,4)4、满矩阵与稀疏矩阵之间的转化例:S=sparse(A)A=full(S)A=[0050;3030;0001;0430]S=sparse(A)whos