MATLAB其他数据类型.ppt_第1页
MATLAB其他数据类型.ppt_第2页
MATLAB其他数据类型.ppt_第3页
MATLAB其他数据类型.ppt_第4页
MATLAB其他数据类型.ppt_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章 MATLAB其他数据类型,4.1 字符与字符串 4.2 单元数组 4.3 结构型变量 4.4 符号型变量,MATLAB支持的数据类型见下图:,4.1 字符与字符串,4.1.1 生成字符串 4.1.2 字符串元素的读取与显示 4.1.3 字符串的ASCII操作 4.1.4 字符串的运算 4.1.5 字符串的执行,4.1.1 生成字符串 字符与字符串运算是各种高级语言不可缺少的部分,Matlab具有强大的字符处理能力。 在MATLAB7.0中的字符串一般是ASCII值的数值数组,它作为字符串表达式进行显示。字符串一般以行向量的形式存在,并且每一个字符占用两个字节的内存。 字符串是一个 ASCII 码的字符数组,与普通数组一样,字符串也可以形成矩阵(表现为一个字符串有多行)。但是,这些行必须有相同数目的列数。因此,要用空格以使所有行有相同长度。,字符串和字符数组,字符串必须用单引号括起来,字符串是由多个字符组成的字符行向量,str1=Matrix Laboratory,str2=M,a,t,r,i,x,字符数组必须是方的,即每行的字符个数必须相等,str3=M,a,t; r,i,x,若需要在字符串内容中包含单引号,则需要在键入字符串内容时,连续键入两个单引号即可。,使用 char 函数,ASCII 码 字符串,直接赋值 只需用单引号()将需设定的字符串引注即可。 stringname=the content of the string,str1=Matrix str2=Laboratory str=str1,str2,str=char(77,97,116,108,97,98),str=char(str1,str2),生成一个字符数组,第一行为 str1,第二行为 str2,例4-8:字符数组存储方式 a=house;china;tiger a = house china tiger a数组保存字符的顺序为: h c t o h i u i g s n e e a r,4.1.2 字符串元素的读取与显示 由于字符串是数值数组,可按数组操作进行读取。用户可以根据需要读取已经设定的字符串中的某一个元素或是多个元素。 字符串的显示有两种方式:直接显示和利用 disp 函数进行显示。,例4-10:读取例4-8中字符数组a的第6个元素、a的第1个到6个元素,并使用disp函数显示a的第1个到6个元素。 a=house;china;tiger; a(6) ans = i a(1:6) ans = hctohi disp(a(1:6) hctohi,str=Matrix double(str(3) double(str),Matlab中字符是以 ASCII 码存储的,因而区分大小写,可用 double 函数查看一个字符的 ASCII 码,4.1.3 字符串的ASCII操作 例4-11:求取字符串s=AaBbCc123的ASCII码,并将其反变换字符串,存储在变量S中。 s=AaBbCc123 double(s) ans = 65 97 66 98 67 99 49 50 51 S=char(ans) ascii = char(reshape(32:127,32,3),由于MATLAB7.0语言是用C语言开发的,因此它的字符串操作与C语言的操作基本相同。常用的字符串操作函数如表所示。,4.1.4 字符串的运算 (1)判断字符串是否相同 (2)字符串中字符的分类 (3)查找与替换 (4)字符串的合并 (5)字符串与数值的转换,(1)判断字符串是否相同(1/2),字符串的比较主要为比较两个字符串是否相同,字符串中的子串是否相同和字符串中的个别字符是否相同。用于比较字符串的函数主要是 strcmp 和 strncmp。 strcmp:用于比较两个字符串是否相同。用法为 strcmp(str1,str2),当两个字符串相同时返回1,否则返回0。当所比较的两个字符串是单元字符数组时,返回值为一个列向量,元素为相应行比较的结果。 strncmp:用于比较两个字符串的前面几个字符是否相同。用法为 strncmp(str1,str2,n), 当字符串的前 n 个字符相同时返回1,否则返回 0。当所比较的两个字符串时单元数组时,返回值为列向量,元素为相应行比较的结果。,还可以通过简单运算比较两个字符串。当两个字符串拥有相同的维数时,可以利用 MATLAB 运算法则,对字符数组进行比较。字符数组的比较与数值数组的比较基本相同,不同之处在于字符数组比较时进行比较的是字符的 ASCII 码值。进行比较返回的结果为一个数值向量,元素为对应字符比较的结果。需要注意的是在利用这些运算比较字符串时,相互比较的两个字符串必须有相同数目的元素。,(1)判断字符串是否相同(2/2),例4-13:调用函数strcmp和strncmp判断字符串word1、word2是否相等 word1=what; word2=whatever; N=strcmp(word1,word2) N = 0 M=strncmp(word1,word2,4) M = 1,例4-14:使用运算比较符来比较字符串word1、word2 %注:此时必须满足word1、word2是相同维数的 word1=what ; % word1后面加了四个空格 word2=whatever; N=(word1=word2) N = 1 1 1 1 0 0 0 0 M=(word1=word2) M = 1 1 1 1 1 1 1 1,进行比较返回的结果为一个数值向量,元素为对应字符比较的结果。,(2)字符串中字符的分类 在MATLAB7.0语言中,字符串中的字符通常可以分为空白字符、字母字符和其他类型的字符。 用户可以用以下两个函数对字符串中的字符进行分类。 isspace:用法为 isspace(str),判断字符串 str 中的字符是否为空格,是空格字符则返回1,否则返回0。 isletter:用法为 isletter(str),判断字符串 str 中的字符是否为字母,是字母则返回1,否则返回0。,例4-15:演示字符分类 word1=what ; word2=whatever; isspace(word1) ans = 0 0 0 0 1 1 1 1 word2=e %可以统计word2中含有字符e的个数 ans = 0 0 0 0 1 0 1 0,(3)查找与替换,查找与替换是字符串操作中的一项重要内容。用于查找的函数主要有 findstr,strmatch,strrep,strtok 等。 findstr:用于在一个字符串中查找子字符串,返回子字符串出现的起始位置。用法为findstr(str1,str2),执行时系统首先判断两个字符串的长短,然后在长的字符串中检索短的子字符串。 strrep:查找字符串中的子字符串并将其替换为另一个子字符串。用法为 str = strrep(str1, str2, str3),将 str1 中的所有子字符串 str2 替换为 str3。,strmatch:在字符数组的每一行中查找是否存在待查找的字符串,存在则返回1,否则返回0。用法为strmatch(str, STRS),查找 str 中以 STRS 开头的字符串。另外可以用strmatch(str, STRS,exact),查找精确包含 STRS 的字符串。 strtok:该函数用于选取字符串中的第一个部分(一个单词)。该函数的简单用法为 strtok(str)。,例4-16:演示字符串的查找与替换 s1 = This is a good example.; a1=findstr(s1,a) a1 = 9 18 a1=findstr(s1,good) a1 = 11 str = strrep(s1, good, great) str = This is a great example.,字符串利用“ ”运算符进行合并,不过合并字符串时需要注意以下两点: 若使用“,”作为不同字符串之间的间隔,则相当于扩展字符串成为更长的字符串向量。 若使用“;”作为不同字符串之间的间隔,则相当于扩展字符串成为二维或者多维的数组,这时,不同行上的字符串必须具有同样的长度。,(4)字符串的合并,水平合并,直接使用中括号,使用 strcat 函数,str1=hello , world!,str2=strcat(hello ,world!),使用 strcat 时,自动去除原字符串结尾处的空格,水平合并得到的是一个更长的字符串,垂直合并,直接使用中括号,使用 strvcat 函数,str3=Matrix ; Laboratory,str4=strvcat(Matrix,Laboratory),在中括号中用分号实现垂直合并,必须保证每个字符串的长度相等,否则需用空格补齐,用 strvcat 合并,自动为较短的字符串补充空格,垂直合并得到的是一个字符数组,数值矩阵到字符数组: num2str、int2str、mat2str 字符数组到数值数组:str2num,字符串、字符数组与数值数组之间的转换,按 ASCII 码转换,字符数组到数值数组:double,数值数组到字符串:char,直接将数值数组转换成字符数组,(4)字符串与数值的转换,在MATLAB7.0语言中,还可以使用hex2num和hex2dec等函数实现十进制、十六进制和二进制数字之间的转换,如表所示。,例4-17,a=97,97.3;97.8,98 str1=char(a) str2=num2str(a) str3=int2str(a) str4=mat2str(a),char 的输入参数范围为 0,65535,当输入参数中有小数时,直接将小数部分舍去。,num2str 直接将每个数字转换成字符,mat2str 把整个矩阵转换成字符行向量,包括矩阵中的方括号、空格 和 分号(逗号自动去除),例4-18,str5=mat2str(97,97.3;97.8,98),数值数组转换为字符数组后,表面上看象一个数值数组,但此时的元素是字符而不是数字!,a=1,2,3 b=num2str(a) c=2*a d=2*b,e=2*str2num(b),4.1.5 字符串的执行,执行字符串所表示的表达式或命令:eval,str=1+2 a=eval(str),eval(string)的作用就是相当于在命令窗里输入string这个命令并执行。 比如 eval(a=rand(2,3) 就相当于在命令窗输入a=rand(2,3)后回车,str=A=magic(3) eval(str),例4-19:用eval执行路径改变命令 cd c: pathname=D:MATLAB701; eval(cd, ,pathname); %执行的功能同cd D:MATLAB701,str1=figure(1); mesh(peaks(60); str2=figure(2); waterfall(peaks(60); eval(str1) eval(str2),4.2 单元数组(元胞数组),4.2.1 单元数组的生成 4.2.2 元胞数组的基本操作 4.2.3 单元数组的显示与获取 4.2.4 单元数组的变维处理,元胞数组是MATLAB的一种特殊数据类型,可以将元胞数组看作无所不包的通用矩阵,或者叫做广义矩阵。组成元胞数组的元素可以是任何一种数据类型的常数或者变量,每一个元素也可以具有不同的尺寸和内存占用空间,每一个元素的内容也可以完全不同,所以元胞数组的元素叫作元胞(cell)。和一般的数值矩阵一样,元胞数组的内存空间也是动态分配的。 与数值数组相同,元组数组的维数不受限制,元胞数组可以是一维的、二维的,甚至也可以是多维的。访问元胞数组的元素可以使用单下标方式或者全下标方式。,4.2.1 元胞数组的创建 组成元胞数组的内容可以是任意类型的数据,所以创建元胞数组之前需要创建相应的数据。,1、 用赋值语句直接定义,A=1 2; 3 4; str=Matlab; M=1:4, A, str; celldisp(M),可以通过以下两种方式定义一个元胞变量,创建元胞数组需要使用运算符花括号,例如在创建数组A时,使用花括号将不同类型和尺寸的数据组合在一起构成了元胞数组,在这个数组中有标量、多维数组、向量和字符串。 注意创建B时使用了不同的方法,该方法是将数组的每一个元素都使用花括号括起来,然后再用数组创建的符号方括号将数组的元素括起来。 还有一种创建元胞数组的方法,如创建数组C时所用的方法,MATLAB自动扩展数组的尺寸,没有被明确赋值的元素作为空元胞数组存在。,一般说来,构成元胞数组的数据类型可以是字符串、双精度数、元胞数组、结构或其他MATLAB数据类型。每一个元胞数据也可以为标量、向量、矩阵、N维数组。,2、用 cell 函数预先分配存储空间,然后对元胞的每个元素逐个赋值。,cell(m,n),生成一个 m 行 n 列 的元胞数组。,cell函数的作用是用来创建空元胞数组,可以创建一维、二维或多维数组,但是创建的数组都为空元胞。注意区别空数组0个字节和空元胞之间4个字节占用内存的区别。,4.2.2 元胞数组的基本操作 主要包括对元胞数组元胞和元胞数据的访问、修改,元胞数组的扩展,收缩或者重组。与操作一般的数值数组相类似,操作数值数组的函数也可以应用在元胞数组上。例如:,这里使用圆括号直接访问元胞数组的元胞。获取的数据也是一个元胞数组。,例:元胞元素的访问。,使用花括号可以直接获取元胞数组的元胞内容。,例4-20:使用cell函数生成元胞数组 A=cell(2,2) A = A1,1=1 A = 1 A1,2=wang A = 1 wang ,4.2.3 元胞数组的显示与获取,A=1 2; 3 4; str=Matlab; M=1:4, A, str N=hello, M; eye(2),magic(3),N1,1 N1,2 N1,21,2 N1,21,2(2,1),元胞变量的引用必须使用大括号。,相关函数,celldisp,输出元胞变量的内容。,cellplot,用图形方式显示元胞变量的内容。,iscell,判别一个变量是否为元胞变量。,例,A=1 2; 3 4; str=Matlab; M=1:4, A, str; celldisp(M) cellplot(M) iscell(A) iscell(M),celldisp 函数用于显示单元数组的全部内容,有时候只需要显示单元数组的一个单元,可以用花括号对单元进行索引。,例4-21:使用celldisp函数显示元胞数组内容 A=1,wang,1+3i,1 2;3 4; celldisp(A) A1 = 1 A2 = wang A3 = 1.0000 + 3.0000i A4 = 1 2 3 4,例4-22:使用花括号获取元胞数组的内容 A=1,wang,1+3i,1 2;3 4; A1 ans = 1 A4 A(4)其类型为cell型,而A4类型为其应属的类型 ans = 1 2 3 4,4.2.4元胞数组的变维处理,改变数组的维数可以通过添加或删除数组元素完成。删除数组元素时,采用的索引方式为一维下标,格式为: A(cell_subscripts) = 。 得到的元胞数组为原数组中剩下元素排列而成,为一维数组。添加数组元素时,自动添加该数组所对应的行和列,其他元素为空。 另外可以通过函数 reshape 改变数组的形状。reshape 函数按照顺序将原元胞数组的元素进行重新放置,得到新的元胞数组元素个数与原数组相同。,例4-23:添加或删除单元数组的单元 A=1,wang,1+3i,1 2;3 4; B=5 6;7 8,li,zhang,1 2 3;4 5 6; C=A,B D=A;B F=D whos C D E=D(1,:) D2= D(4)= F(2,:)= F(2,5)= energy,例4-24:使用reshape函数改变单元数组的结构 A=1,wang,1+3i,1 2;3 4; B=reshape(A,2,2) B = 1 1.0000+ 3.0000i wang 2x2 double whos A B 在MATLAB7.0语言中,与单元数组相关的操作还有iscell、cellfun和num2cell等函数,大家可以参考MATLAB7.0的Help做进一步了解。,4.3 结构型变量,4.3.1 结构型变量的生成 4.3.2 结构型变量的操作,和C语言类似,MATLAB也具有结构类型的数据。结构(struct)是包含一组记录的数据类型,而记录,则存储在相应的字段中。结构的字段可以是任意一种MATLAB数据类型的变量或者对象。,4.3.1 结构型变量的生成 可以使用两种方法生成结构型变量,一种是在命令窗口中直接输入,还有一种是使用struct函数。 通过直接输入结构体各元素值的方法可以创建一个结构体。输入的同时定义该元素的名称,并使用“.”将变量名与元素名连接。 struct 函数的最基本的使用方式是 struct_name=struct(field1,V1,field2,V2,.),其中 fieldn 是各成员变量名,Vn为对应的各成员变量的内容。,例4-25:用直接输入法生成结构型变量 student.score=90 95 89 100 99; =Li Ning; student.weight=69; student.height=178; student.number=200708008; student whos student,例4-26:使用struct函数生成结构型变量 s = struct(field1, , field2, , .) creates an empty structure with fields field1, field2, student=struct(number,200708008, 200709009,name,Li Ning,Ma Lin) student(2).name,4.3.2 结构型变量的操作 对于结构的基本操作其实就是对结构型变量元素包含的记录的操作。主要有结构记录数据的访问,字段的增加和删除等。 访问结构数组元素包含的记录的方法很简单,直接使用结构数组的名称和字段的名称以及操作符“.”完成相应的操作。,添加成员变量,如果需要向结构体中添加新的成员,可以直接输入该变量的名称并赋值。,例4-27:在结构型变量中添加成员变量 student=struct(number,200708008, 200709009,name,Li Ning,Ma Lin); student(1).gender=Male; student(1).age=21; student(2).gender=Male; student(2).age=22; student,删除成员变量,在 MATLAB 中可以使用函数 rmfield 从结构体中删除成员变量。命令 S=rmfield(S,field) 将删除结构体 S 中的成员 field,同时保留 S 原有的结构。 可以使用命令 S=rmfield(S,fields) 一次删除多个成员,其中 fields 为字符行变量或者元胞型变量。该命令删除 fields 中指定的成员。,例4-28: 在结构型变量中删除成员变量 s = rmfield(s,field) removes the specified field from the structure array s. student=struct(number,200708008, 200709009,name,Li Ning,Ma Lin); student=rmfield(student,name) student = 1x2 struct array with fields: number,在MATLAB7.0中,getfield和setfield函数也是有关结构型变量的函数。 getfield函数获取当前存储在某个成员变量中的值。 setfield函数给某个成员的变量插入新的值,其作用与“结构型变量名.filed新值”等价。 例4-29: getfield和setfield函数的使用,student=struct(number,200708008,200709009,name,Li Ning,Ma Lin); GETF=getfield(student(2) ,number) SETF=setfield(student(2) ,number,20120752),例4-29: getfield和setfield函数的使用,4.4 符号型变量,4.4.1 符号变量、符号表达式和符号方程 的生成(独立变量) 4.4.2 符号表达式的操作 4.4.3 符号函数画图,4.4.1 符号变量、符号表达式和符号方程的生成 符号变量要先定义,后引用。可以用sym函数、syms函数将运算量定义为符号型数据。 例4-32:使用sym函数定义符号表达式ax2+bx+c x = sym(x) creates the symbolic variable with name x and stores the result in x., a=sym(a); b=sym(b); c =sym(c); x=sym(x); f=a*x2+b*x+c f= a*x2+b*x+c ,例4-32:使用sym函数定义符号表达式ax2+bx+c,syms函数的功能比sym函数要更为强大,它一次可以创建任意多个符号变量。而且,syms函数的使用格式也很简单。 格式为:syms arg1 arg2 . 例4-33:使用syms函数定义符号表达式ax2+bx+c syms a b c x f=a*x2+b*x+c f = a*x2+b*x+c,例4-34:使用syms函数生成符号方程式ax2+bx+c2 syms a b c x f=sym(a*x2+b*x+c=2) f = a*x2+b*x+c=2,补充:当字符表达式有一个变量是独立变量,其余的文字符号作为常量处理。 前面所指的独立变量也称为缺省变量,是在求函数的极限、导数和积分时,如果用户没有明确指定自变量,MATLAB将按缺省原则确定主变量并对其进行相应微积分运算。 可用findsym(S,1)查找系统的缺省变量。 syms a b c x f=sym(a*x2+b*x+c=2) findsym(S,1) findsym(S,4),如果用户不指定哪一个变量是独立变量,MATLAB将用以下规则选择一个独立变量: 除去i和j的小写字母,表达式中如果没有其他字母,选择x的字符变量 如果有多个字符变量,选择在字母顺序中最接近x的字符变量 如果有相连的字母,选择在字母表中较后那个,例如: syms x y z diff(sin(x)+cos(y)+tan(z) ans = cos(x) findsym(sin(x)+cos(y)+tan(z),1) ans = x diff(sin(x)+cos(y)+tan(z),y) ans = -sin(y),符号常量:不含变量的符号表达式叫做符号常量。例如: f=sym(2*4-6) f = 2*4-6 如果要求f的数值运算,利用subs指令可以完成。 subs(f) ans = 2,4.4.2 符号表达式的操作 (1)提取分子和分母 (2)符号表达式的四则运算 (3)合并符号表达式的同类项 (4)符号多项式的因式分解 (5)符号多项式的化简 (6)符号表达式的替换求值 (7)符号微积分,(1)提取分子和分母 如果一个表达式是一个有理分式,或是可以展开为有理分式,可以利用numden命令来提取分子或分母。 例如: f=sym(s+1)/(s2+5*s+6) f = (s+1)/(s2+5*s+6) nm,dm=numden(f) nm = s+1 dm = s2+5*s+6,(2)符号表达式的四则运算 符号表达式的四则运算与通常的算术式一样,可以进行四则运算。 例4-36:符号表达式的四则运算 syms x y a b f1=sin(x)+cos(y) f1 = sin(x)+cos(y) f2=a-b f2 = a-b f1*f2 ans = sin(x)*cos(y)*(a-b),(3)合并符号表达式的同类项 R = collect(S,v)将符号矩阵S所有同类项合并,并以v为变量输出。 例4-37:使用collect函数合并符号表达式的同类项 syms x y d=5*x2+x3+y*x2+y+1+5*x-y*x d = 5*x2+x3+x2*y+y+1+5*x-y*x collect(d,x) ans = x3+(5+y)*x2+(5-y)*x+y+1,(4)符号多项式的因式分解 格式为R = horner(P),将符号表达式P进行因式分解。 例4-38:使用horner对符号多项式进行因式分解 syms x f1=2*x3+4*x2+5*x+10 f1 = 2*x3+4*x2+5*x+10 horner(f1) ans = 10+(5+(4+2*x)*x)*x,(5)符号多项式的化简 simplify(S)命令将符号表达式S中的每个元素都进行简化,而simple(S)函数要比simplify(S)函数简单,所得的结果也比较合理。 syms x f1=2*x3+4*x2+5*x+10 f1 = 2*x3+4*x2+5*x+10 t=horner(f1) t = 10+(5+(4+2*x)*x)*x simple(t) (2+x)*(2*x2+5),例4-39:使用simplify和simple函数对符号函数进行化简 syms x f=cos(x)2-sin(x)2 f = cos(x)2-sin(x)2 simplify(f) ans = 2*cos(x)2-1 simple(f) ans = cos(2*x),(6)符号表达式的替换求值 使用subs函数可以将符号表达式中的字符型变量用数值型变量替换。 subs(S,old,new) 例4-40:使用subs函数进行替换求值操作 syms x y f= x2- x; subs(f,x,2) ans = 2 subs(f,x,y) ans = y2-y,例4-41:求解下列方程组,并算出a=2、b=5时,x、y的值 syms a b x y x,y=solve(a*x-b*y-1=0,a*x+b*y-5=0,x,y) x = 3/a y = 2/b subs(x,2,a) ans = 1.5000 subs(y,5,b),(7)符号微积分 例4-42:求下列函数的极限 limit(F,x,a) takes the limit of the symbolic expression F as x - a. limit(F,a) uses findsym(F) as the independent variable. limit(F) uses a = 0 as the limit point. limit(F,x,a,right) or limit(F,x,a,left) specify the direction of a one-sided limit., syms a x; f=sin(x)/x; limit(f,x,a) ans = sin(a)/a limit(f,x,0) ans = 1 limit(f,x,inf) ans = 0,例4-43:求下列函数的微分 diff(s,v,n):以v为自变量,对符号表达式s求n阶导数。 syms x y f=y2*x5; f1=diff(f,x,2) f1 = 20*y2*x3 f2=diff(f1,y,1) f3=sin(x) f4=diff(f3,x,1) f5=diff(f3,x,2),例4-44:求下列函数的积分 int(s,v,a,b):求定积分运算。以v为自变量,a与b分别表示定积分的下限和上限。 sym

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论