MATLAB运算基础.ppt
2 MATLAB 运算基础(2),2.4稀疏数组 数组元素的存储数组元素有完全存储方式和稀疏存储方式两种存储方式。完全存储方式是将数组的全部元素按列存储。稀疏存储方式仅存储矩阵所有的非零元素的值及其位置,即行号和列号。稀疏数组特点是只存储矩阵的非零元素,从而节省内存和时间开销,并且存储按列进行;对于每列,用一个实数或复数数组记录非零元素值,在用一个整数数组记录相应非零元素的行下标。,稀疏数组的建立(两种方法)1 转换函数转换函数sparse的格式为:A=sparse(S)功能:将矩阵S转化为稀疏存储方式的矩阵A。当矩阵S是稀疏存储方式时,则函数调用相当于A=S。,sparse(m,n)功能:生成一个mn的所有元素都是0的稀疏矩阵。sparse(u,v,S)功能:建立一个max(u)行、max(v)列并以S为稀疏元素的稀疏矩阵,其中u,v,S是3个等长的向量,S是要建立的稀疏矩阵的非0元素,u(i)、v(i)分别是S(i)的行和列下标。,转换函数full的格式为:full(A)功能:返回和稀疏存储矩阵A对应的完全存储方式矩阵。,例2-28 演示sparse和full的功能。u=1:4;v=3:6;S=0.1 0.2 0.3 0.4;spa=sparse(u,v,S)a=full(spa),2 生成函数稀疏矩阵的生成函数:spconvert,spdiags,speyespconvert函数的格式为:B=spconvert(A)功能:将矩阵A所描述的一个稀疏矩阵转化为一个稀疏存储矩阵。其中A为一个m3或m4的矩阵,其每行表示一个非0元素,m是非0元素的个数,A每个元素的意义是:(i,1)第i个非0元素所在的行。(i,2)第i个非0元素所在的列。(i,3)第i个非0元素值的实部。(i,4)第i个非0元素值的虚部,若矩阵的全部元素都是实数,则无须第四列。,例2-29 演示spconvert的功能。A=1 2 3;3 4 5;6 7 8;B=spconvert(A)%生成实数数组A=1 2 3 4;3 4 5 6;6 7 8 9;B=spconvert(A)%生成复数数组,函数eye,rand和 randn产生完全存储方式的矩阵,对应的稀疏矩阵函数是speye,sprand和sprandn。单位矩阵的稀疏存储的函数speye的调用格式:speye(m,n)功能:返回一个mn的稀疏存储单位矩阵。例2-31 分析下列语句的功能。spa=speye(4,4)%建立44的稀疏存储单位矩阵spa(2,1)=-2%增加元素spa(2,1)spa(2,2)=0%删除元素spa(2,2),2.5矩阵和数组的运算 运算要素的定义是不同的:矩阵运算规则是按照矩阵作为运算要素定义的,数组运算是按照矩阵元素作为运算要素定义的。标量运算是矩阵和数组的运算的特例。,矩阵和数组的算术运算1 矩阵和数组的加减运算两个矩阵必须同型时才可以进行加减运算。如有一个是标量,则该标量与矩阵的每个元素进行加减运算。设A=(aij)mn,B=(bij)mn,则矩阵C=(cij)mn=(aij+bij)mn称为矩阵A与B的和,记作C=A+B。其中aij和bij分别表示矩阵A和B的第i行第j列元素。数组的加减运算法则与矩阵的加减运算法则相同。,例2-32 设 求 A2B。方法1:A=4-3 1;2 0 5;B=1 2 0;-1 0 3;A-2*B方法2:A=4-3 1;2 0 5;B=1 2 0;-1 0 3;b=uminus(2*B)%,返回2*B的相反数A+b,2 矩阵和数组的乘法运算矩阵的乘法运算符为*,定义为:设A=(aij)ms,B=(bij)sn,则A与B的乘积是 mn矩阵:CAB=(cij)mn其中cij(i=1,2,m;j=1,2,n)等于A的第i行与B的第j列对应元素的乘积之和。,数组的乘法运算符为.*,两个矩阵必须同型时才可以进行数组乘法运算。运算规则为:矩阵A和B中的对应元素相乘。如果参加运算的矩阵其中有一个是标量时,矩阵和数组的乘法运算均为标量与矩阵的每个元素进行乘法运算。,例2-33求乘积 AB 和 BA。A=1 0 3;2 1 0;B=4 1;-1 1;2 0;A*B,B*A,例2-34求(AB)T和BTAT(T为转置运算)。A=1-1 2;2 0 1;B=2-1 0;1 1 3;4 2 1;(A*B)B*A,3 矩阵和数组的除法运算矩阵除法运算的运算符为和/,分别表示左除和右除。矩阵除法的定义为:AB=A-1B A/B=AB-1其中A-1和B-1是矩阵A和B的逆。矩阵B的逆可用函数inv求得。,数组除法运算的运算符为.和./,分别为数组的左除和右除,表示数组的相应元素相除。两个矩阵必须同型时才可以进行数组除法运算。定义为:设A=(aij)mn,B=(bij)mn,则数组的右除为C=(cij)mn=(aij/bij)mn,数组的左除为C=(cij)mn=(bij/aij)mn。,例2-35 求解方程组A=2 2-1 1;4 3-1 2;8 3-3 4;3 3-2-2;b=4 6 12 6;X=Ab%等价语句为 X=inv(A)*b,2.5.2 矩阵和数组的乘方运算1)矩阵乘方运算运算符为,运算表达式为AB,矩阵乘方运算的含义是:AB表示方阵A自乘B次。2)数组乘方运算运算符为.,运算表达式为A.B,其中A和B都可以是矩阵或标量。,数组乘方运算有下列形式:1)当A为矩阵,B为正整数时,则将aij自乘B次;2)当A为矩阵,B也为矩阵时,A和B矩阵必须同型,则将aij自乘bij次。3)当A为正整数,B为矩阵时,将Abij构成新矩阵的第i行第j列元素。其中aij和bij分别表示矩阵A和B的第i行第j列元素。,矩阵和数组的数学函数常用的数学函数:三角函数、指数函数和整值函数等。注意:MATLAB 6.5以前的版本三角函数的自变量和反三角函数的返回值为弧度,MATLAB 7.0版本中提供了三角函数的自变量和反三角函数的返回值分别为角度和弧度的两类函数。,例2-36 求30。、60。和90。的正弦、余弦、正切和余切函数值。x=30:30:90;sind(x),cosd(x),tand(x),cotd(x)%三角函数的自变量为角度值,例2-37求0.1,0.2,0.3,0.4,0.5,0.6的反正弦、余弦和反正切值。x=0.1:0.1:0.6;asin(x),acos(x),atan(x)%返回值为弧度asind(x),acosd(x),atand(x)%返回值为角度,例2-38 求1到10的自然对数和常用对数。x=1:10;log(x)%返回值为自然对数log10(x)%返回值为常用对数如果求2为底的对数呢?log10(x)/log10(2),2.6字符串字符串的定义字符串是作为字符数组来引入的,语句形式为用单撇号括起来的字符序列。MATLAB将字符串当作一个行向量,每个元素对应一个字符,一个字符占两个字节,并且每一字符(包括空格)以其ASCII码的形式存放,其标识方法和数值向量相同。,例2-39建立任意的两个字符串。s1=Northeast Forest Uiversity%赋值方式建立字符串s1s2=Haerbin Heilongjiang%赋值方式建立字符串s2whos命令可以查看字符串占用的字节信息,Name Size Bytes Class1 1x26 52 char arrays2 1x20 40 char arrayGrand total is 46 elements using 92 bytes,常用的字符串函数:length 计算字符串的长度(即组成字符的个数)class 判断某一个变量是否为字符串,返回char 表示为字符串findstr 寻找在某个长字符串中的子字符串,返回其起始位置deblank 删除字符串尾部的空格eval 以表达式方式执行字符串disp 显示字符串的内容,已知s1=Northeast Forest Uiversitylength(s1)ans=26class(s1)ans=charfindstr(s1,st)ans=8 15,deblank(s1)ans=Northeast Forest Uiversitya=3.141592;b=eval(a)b=3.1416a=3.141592;disp(a)3.141592,字符串的连接和替换 常用的字符串的连接和替换函数strcat(S1,S2,S3,.)返回S1,S2,S3的连接字符串 strvcat(T1,T2,T3,.)返回T1,T2,T3,.的垂直连接字符串strmatch(S1,S2)在逐行搜索字符串s2,给出以s1开头的那些行的行号strrep(S1,S2,S3)把字符串s1的所有出现s2的地方替换为s3strtok(S)查找字符串S的第一个间隔符(空格符、指表符、回车符)前的内容,例2-40 分析下列语句的执行结果。test=This is a test!;position=findstr(test,is)array=strvcat(maxarray,min value,max value);result_1=strmatch(max,array)result_2=strrep(test,test,pest)token,remainder=strtok(This is a test!),字符串比较函数strcmp(S1,S2)比较字符串是否相等。如果相同则返回1,否则为0。strcmpi(S1,S2)在忽略大小写的情况下,比较字符串是否相等。如果相同则返回1,否则为0。strncmp(S1,S2,N)比较两个字符串的前n个字符是否相等。如果相同则返回1,否则为0。strncmpi(S1,S2,N)在忽略大小写的情况下,比较字符串的前n个字符是否相等。如果相同则返回1,否则为0。,例2-41 分析下列语句的执行结果。str1=hello;str2=Hello;str3=help;c1=strcmp(str1,str2)c2=strcmpi(str1,str2)c3=strncmp(str1,str3,2)c4=strncmpi(str1,str3,2),字符串转换函数upper(A)把字符串A中的任一小写字母转换为相应的大写字母lower(A)把字符串A中的任一大写字母转换为相应的小写字母double(X)转换字符串X为ASCII码char(X)将ASCII码X转换为字符串int2str(X)将整数X转换为字符串num2str(X)将数值X转换成字符串mat2str(MAT)将数值矩阵MAT转换为可执行的形式,已知str=This is a test upper(str)ans=THIS IS A TESTlower(str)ans=this is a testdouble(str)ans=84 104 105 115 116,char(double(str)ans=This is a testX=1:3:10;int2str(X)ans=1 4 7 10num2str(randn(2,2),3)ans=-0.433 0.125-1.67 0.288mat2str(magic(2)ans=1 3;4 2,例2-42 分析下列语句的功能。x=5317;y=int2str(x)p=num2str(pi,7)p=num2str(pi,%10.5e)a=1 2 3;4 5 6;b=mat2str(a)str=sprintf(The value of pi=%8.6f.,pi),2.7 元胞数组2.7.1 元胞数组的建立元胞数组:允许在一个数组里存放各种不同类型的数据的一种特殊的数据类型。元胞数组中的基本组成是元胞,每一个元胞是用来存放各种不同类型的数据的单元。如果元胞中存放的数据为元胞数组,则为元胞数组的嵌套使用。1 赋值语句赋值语句的右边为用符号标记的不同类型的数据。,例2-43 建立元胞数组,并查看元素的信息。a=This is the first example.,hadamard(2);ones(3),North;East执行结果如下:a=1x26 char 2x2 double 3x3 double 2x1 cell,元胞数组A创建后可以使用命令whos查看工作空间的变量详细信息:Name Size Bytes Classa 2x2 534 cell arrayGrand total is 54 elements using 534 bytes由此可知a为2x2的元胞数组。,查看a的各个元素的信息:a1,1,a1,2,a2,1,a2,2ans=This is the first example.ans=1 1 1-1ans=1 1 1 1 1 1 1 1 1ans=North East,例 2-44用为各元胞元素赋值的方法创建元胞数组。b(1,1)=This is the second example.;b(1,2)=hilb(3);b(2,1)=zeros(2);b(2,2)=South;West;b%查看b的内容执行结果为:b=1x27 char 3x3 double 2x2 double 2x1 cell,2 由各元胞元素赋值创建用依次为各元胞元素赋值的方法创建元胞数组,需要先创建空的元胞数组,然后输入各元胞内容。创建元胞数组的函数为:cell(N)创建空的NN的元胞数组cell(M,N)或 cell(M,N)创建空的M N的元胞数组,例2-45 由各元胞元素赋值创建元胞。c=cell(2);c1,1=(This is the third example.);c1,2=compan(1 0 3);c2,1=3+4*i-5;-10*i 3-4*i;c2,2=;%元胞数组的第四个元素为空矩阵 c%查看c 的内容c=1x27 char 2x2 double 2x2 double,显示元胞数组的内容有如下三个函数:celldisp(C)功能:显示元胞数组C的所有元素的内容cellplot(C)功能:以嵌套的格子的形式显示元胞数组C的所有元素的结构d=cellfun(fun,c)功能:返回判断元胞数组c 的元素数据类型和基本信息的数组d,其中fun为isreal,isempty,islogical,length,ndims和prodofsize。,2.7.2 转换函数元胞数组与其他数组的转换函数有三个:M=cell2mat(C)功能:元胞数组转换为单精度矩阵。其中C为多维元胞数组,M为转换后得到的单精度矩阵。要求输入的元胞数组元素必须是同类型的数据。C=mat2cell(X,M,N)功能:矩阵分解为元胞数组。其中X为多维元胞数组,C为转换后得到的矩阵。C=num2cell(A)功能:转换数值数组为元胞数组。其中A为数值数组,C为转换得到的元胞数组。,例2-46 元胞数组与其他数组的转换。x=1 2 3 4;5;9 6 7 8;10 11 2;cell2mat(x)%转换数值数组为单精度矩阵ans=1 2 3 4 5 6 7 8 9 10 11 12,X=zeros(3,4)+5;C=mat2cell(X,1 2,1 3)%矩阵分解为元胞数组C=5 1x3 double2x1 double 2x3 doubleA=1 2 3 4;5 6 7 8;9 10 11 12;C=num2cell(A)%转换数值数组为元胞数组C=1 2 3 4 5 6 7 8 9 10 11 12,元胞数组的使用1 直接引用 元胞数组的元素的引用可通过指出数组名称直接引用。元胞数组中可以引用的元素为元胞数组的结构、元胞数组的内容、元胞数组的部分元素。,例2-47 演示元胞数组的直接引用方法。a=This is the forth example.,magic(3);ones(3),North;Easta(1,2)%查看a(1,2)的结构ans=3x3 doublea1,2%查看a1,2元胞的内容ans=8 1 6 3 5 7 4 9 2,a1,2(1)%引用a1,2元胞的第1个元素ans=8a1,2(1 2)%引用a1,2元胞的第1、2个元素ans=8 3,2扩展元胞数组例 2-48 演示元胞数组的扩展方法。a3,3=5%扩展a为33的数组,a(3,3)为元胞,内容为5a=1x26 char 3x3 double 3x3 double 2x1 cell 5,3删除元胞数组例2-49 演示元胞数组的删除方法。a3,3=%删除a的第三行、第三列元素a=1x26 char 3x3 double 3x3 double 2x1 cell a(3,:)=%删除a的第三列元素a=1x26 char 3x3 double 3x3 double 2x1 cell,2.8构架数组构架数组的建立 构架数组的基本组成是域,每一个域是用来存放各种不同类型的数据的单元。和元胞数组类似,构架数组的建立也有三种方法:赋值语句 创建函数 转换函数,1 赋值语句赋值语句是建立构架数组的最简单的一种方法。例2-50 使用赋值语句依次为各个域赋值的方法建立构架数组,存储两名学生的名字、学号、性别、班级信息。s.name=Wang Ming;s.number=19990101;s.sex=man;s.class=199901;%建立构架数组s,如查看构架数组的内容,语句为:s执行结果为:s=name:Wang Ming number:19990101 class:199901 sex:man如查看构架数组的某一个域内容,语句为:s.name执行结果为:ans=Wang Ming,s(2).name=Zhang Le;s(2).number=19990201;s(2).sex=man;构架数组的第二个元素可以被通过增加下标实现。如查看构架数组的各个域名,语句为:s执行结果如下:s=1x2 struct array with fields:name number class sex这时,s是一个1*2的数组。,可通过下面的语句查看s的内容:s(1),s(2)执行结果如下:ans=name:Wang Ming number:19990101 class:199901 sex:manans=name:Zhang Le number:19990201 class:sex:man,2 创建函数使用struct函数可以建立构架数组格式为:S=struct(field1,VALUES1,field2,VALUES2,.)功能:创建构架数组S,其中 field1的值赋为VALUES1,field2的值赋为VALUES2。,例 2-51应用struct函数可以创建同上的构架数组。s=struct(name,Wang Ming,number,19990101,class,199901,sex,man)s=name:Wang Ming number:19990101 class:199901 sex:man,3 转换函数元胞数组转换为构架数组的函数为cell2struct,格式为:S=cell2struct(C,FIELDS,DIM)功能:元胞数组C转换为构架数组S。其中FIELDS为字符串数组或元胞数组,DIM为元胞数组的维数。,例2-52应用cell2struct函数可以创建同上的构架数组。c=Zhang Ming,19990102,femal,199901;f=name,number,sex,class;s=cell2struct(c,f,2)执行结果如下:s=name:Zhang Ming number:19990102 sex:femal class:199901,域的增加和删除1 获取域名构架数组创建后可通过函数fieldnames获取构架数组的域。fieldnames的格式为:NAMES=fieldnames(S)功能:返回构架数组S的域名构成的元胞数组NAMES,例2-53 给出构架数组s的全部域名。NAMES=fieldnames(s)执行结果如下:NAMES=name number sex class exams,2 增加和删除域 构架数组建立后,允许增加和删除域。构架数组的域的删除可通过函数rmfield实现。函数rmfield的调用格式为:S=rmfield(S,field)功能:从构架数组S中删除域field。,例2-54 演示通过赋值语句增加域的方法。在已建立的构架数组s的基础上,增加课程成绩域exams(三门功课),并删除s的域sex。s(2).exams=90 82 88;%增加s的域exams,并通过赋值语句为s(2)赋值s(1)%查看s(1,1)的详细信息s(2)%查看s(1,2)的详细信息,执行结果如下:ans=name:Wang Ming number:19990101 sex:man class:199901 exams:ans=name:Zhang Le number:19990201 sex:man class:exams:90 82 88,s2=rmfield(s,sex)%删除s的域sex执行结果如下:s2=1x2 struct array with fields:name number class exams,构架数组元素的引用构架数组的元素的引用可通过指出数组名称、下标、域名直接引用。例 2-55演示构架数组元素的引用方法。s(1).numbers(2).number%引用number元素ans=19990101ans=19990201s(2).exams%引用exams元素,并求其平均值ans=90 82 88,averge=(s(2).exams(1)+s(2).exams(2)+s(2).exams(3)/3%求平均值averge=86.6667s(2).aver=averge%增加aver域,并赋值为平均值s2=1x2 struct array with fields:name number class exams aver这时s成为1x2 构架数组,并有域name、number、class、exams和aver。,2.8.4 getfield和 setfield函数函数getfield 的格式为:F=getfield(S,i,j,field,k)功能:获取构架数组的指定的域的域值。其中S是构架数组名,i,j用来指定元素构架的下标,field是指定的域名,必须是字符串,k用来指定域中数组的下标。,函数setfield的格式为:S=setfield(S,field,V)S=SETFIELD(S,i,j,field,k,V)功能:设置构架数组的指定的域的域值,其中S是构架数组名,i,j用来指定构架数组元素的下标,field是指定的域名,必须是字符串,V是设置值。注意:S(i,j).field(k)=V,例2-56演示函数getfield和 setfield的使用方法。getfield(s,1,2,exams,2)%获取s的第二个元素域exams 的第2个值执行结果为:ans=82S=setfield(s,1,1,exams,1 2 3,88 98 78)%获取s的第一个元素的域exams 的域值如果为aver设置域值呢?averge=(S(1).exams(1)+S(1).exams(2)+S(1).exams(3)/3%求平均值执行结果为:averge=88,S=setfield(s,1,1,aver,averge)%设置aver的域值S=1x2 struct array with fields:name number sex class exams averS.aver%设置后查看aver的域值ans=88,构架数组的嵌套例2-57为构架数组s增加教师域,域名为teacher,每名教师有三个域:name(名字)、number(编号)和course(讲授课程)。s(1).teacher.name=Liu Ming;s(1).teacher.number=010101;s(1).teacher.course=math;MATLAB;Maple;%构架数组s增加教师域,并赋值,执行结果为:s=1x2 struct array with fields:name number sex class exams aver teacher这时,s增加了一个域。,s(1).teacher%查看s的域teacher执行结果为:ans=name:Liu Ming number:010101 course:3x6 chars(1).teacher.course%查看s的域teacher的course信息执行结果为:ans=math MATLABMaple,一个班级有多名教师,如何存储信息呢?s(1).teacher(2).name=Liu Ming;s(1).teacher(2).name=Wang Ming;s(1).teacher(2).number=010102;s(1).teacher(2).course=Digital image processing,MATLAB;s(1).teacher(2)%查看s的域teacher的信息执行结果为:ans=name:Wang Ming number:010102 course:Digital image processing MATLAB,小结:(1)MATLAB变量的管理方法;(2)建立数值数组的常用方式;(3)提取子数组的方法;(4)元胞数组与构架数组的建立和有关的常用函数;(5)矩阵与数组的乘除法运算和乘幂运算的规则;(6)常用的矩阵和数组运算函数的调用格式和功能。,P53 2 3 4 5 6 8 10 11 13 14,