1、第三章第三章 字符串字符串 字符串数组的建立字符串数组的建立 单元数组的建立单元数组的建立 结构数组的建立结构数组的建立 数字与字符串的相互转换数字与字符串的相互转换 第一节第一节 字符串数组的建立字符串数组的建立 在在Matlab中,字符串数组的建立方法有多种,下面举中,字符串数组的建立方法有多种,下面举例说明。例说明。【例【例3-1】直接输入法创建字符串数组。直接输入法创建字符串数组。a=hello;b=你好你好;c=a,b,.;aa=hello bb=你好你好 cc=hello 你好你好.从例从例3-1中可以看出,创建字符串数组的基本方法就是中可以看出,创建字符串数组的基本方法就是直接用
2、单引号将一系列字符串括起来,其中的每个字符都直接用单引号将一系列字符串括起来,其中的每个字符都是该字符串的一个元素,通常用两个字节来存储;当字符是该字符串的一个元素,通常用两个字节来存储;当字符串文字中包含单引号时,每个单引号符号需要使用串文字中包含单引号时,每个单引号符号需要使用2 2个连续个连续的单引号字符;并且可以直接引用短的字符串构成长的字的单引号字符;并且可以直接引用短的字符串构成长的字符串。符串。注意注意 :字符串是特殊的:字符串是特殊的ASCIIASCII数值型数组,而显示出来的数值型数组,而显示出来的是字符形式。是字符形式。【例【例3-2】利用利用ASCII码创建字符串数组。码
3、创建字符串数组。b=你好你好;ASCIIb=double(b);c=char(ASCIIb);bb=你好你好 ASCIIbASCIIb=20320 22909 cc=你好你好【例【例3-3】使用函数创建字符串数组。使用函数创建字符串数组。c1=char(China changchun,ccit);c2=str2mat(China,Changchun,ccit);a1=auto;a2=film;a3=forest;a4=city;b1=strvcat(a1,a4);b2=strvcat(a2,a4);b3=strvcat(a3,a4);查看上述语句运行结果。在命令窗口输入变量名,结果如查看上述语
4、句运行结果。在命令窗口输入变量名,结果如下:下:c1c1=China changchunccit c2c2=China Changchunccit b1b1=auto city 在在Matlab中,使用以上三个函数来创建字符串时,中,使用以上三个函数来创建字符串时,不需要注意每个字符串变量的长度是否相等。不需要注意每个字符串变量的长度是否相等。值得值得注意注意的是,函数的是,函数strcat()在合并字符串的同时会把字在合并字符串的同时会把字符串结尾的空格删除。符串结尾的空格删除。b2b2=film city b3b3=forest city 第二节第二节 单元数组的建立单元数组的建立单元数组
5、的建立方法有三种方式单元数组的建立方法有三种方式:1、利用赋值语句建立单元数组、利用赋值语句建立单元数组【例【例3-4】利用赋值语句建立一个单元数组。利用赋值语句建立一个单元数组。A(1,1)=Matlab;A(1,2)=7.0;A(2,1)=矩阵矩阵;A(2,2)=1 2 3;4 5 6;7 8 9;AA=Matlab 7.0 矩阵矩阵 3x3 double 当然,也可以用另外一种方法建立,即用花括号括起单当然,也可以用另外一种方法建立,即用花括号括起单元的下标,在赋值语句的右侧直接指定单元的内容。如上面元的下标,在赋值语句的右侧直接指定单元的内容。如上面的命令可写成:的命令可写成:A1,1
6、=Matlab;A1,2=7.0;A2,1=矩阵矩阵;A2,2=1 2 3;4 5 6;7 8 9;AA=Matlab 7.0 矩阵矩阵 3x3 double2、利用单元数组法建立单元数组、利用单元数组法建立单元数组建立单元数组时,可以在花括号中直接赋值,单元与单元之建立单元数组时,可以在花括号中直接赋值,单元与单元之间用逗号、空格或分号隔开。间用逗号、空格或分号隔开。【例【例3-5】利用单元数组法建立一个单元数组。利用单元数组法建立一个单元数组。A=Matlab,7.0,矩阵矩阵,1 2 3;4 5 6;7 8 9A=Matlab 7 矩阵矩阵 3x3 double 若想与前面的例子显示一致
7、,可以将若想与前面的例子显示一致,可以将“7.0”后面的后面的逗号改成分号即可。逗号改成分号即可。3、利用函数利用函数cell建立单元数组建立单元数组cell函数是用来预分配指定大小的单元数组,其调用格函数是用来预分配指定大小的单元数组,其调用格式如下:式如下:c=cell(n)建立建立nn单元数组单元数组,单元是空矩阵。单元是空矩阵。c=cell(m,n)或或c=cell(m,n)建立建立mn单元数组,单元数组,单元是空矩阵。单元是空矩阵。c=cell(m,n,p,)或或c=cell(m,n,p)建立建立mnp的单元矩阵。的单元矩阵。c=cell(size(A)建立和建立和A大小相同的单元数
8、大小相同的单元数组。组。事实上,利用事实上,利用cell函数建立单元数组,是先用函数建立单元数组,是先用cell生成一个空的单元数组,然后再向其中添加所需生成一个空的单元数组,然后再向其中添加所需的数据,见例的数据,见例3-6:【例【例3-6】利用利用cell函数建立单元数组,然后再向其函数建立单元数组,然后再向其中个别单元添加数据。中个别单元添加数据。C=cell(3,3)C=C(1,1)=The Grate Wall C=The Grate Wall C(1,2)=The Summer Palace C=The Grate Wall The Summer Palace C(2,1)=1 2
9、;2 1 C=The Grate Wall The Summer Palace 2x2 double C(3,2)=celldisp C=The Grate Wall The Summer Palace 2x2 double celldisp C(3,3)=cellplot C=The Grate Wall The Summer Palace 2x2 double celldisp cellplot 由例由例3-6可见,单元数组中的内容一般以压缩的形可见,单元数组中的内容一般以压缩的形式显示,我们可以通过函数式显示,我们可以通过函数celldisp来查看单元数组中来查看单元数组中的详细内容或通
10、过函数的详细内容或通过函数cellplot以图形的形式显示单元以图形的形式显示单元数组的内容。数组的内容。【例【例3-7】建立一个单元数组,用函数建立一个单元数组,用函数celldisp和和cellplot将其显将其显 示出来。示出来。clear A A(1,1)=3 2 0;6 3 9;5 5 5;A(1,2)=1+i;A(2,1)=cellarray;A(2,2)=-3:6;A A=3x3 double 1.0000+1.0000i cellarray 1x10 double celldisp(A)A1,1=3 2 0 6 3 9 5 5 5A2,1=cellarrayA1,2=1.000
11、0+1.0000iA2,2=-3 -2 -1 0 1 2 3 4 5 6 cellplot(A)图图3-1 3-1 图形方式显示的单元数组图形方式显示的单元数组 由图由图3-1可见,可见,cellplot命令用大白方格表示各个单元,此命令用大白方格表示各个单元,此例共例共4个单元,所以有个单元,所以有4 4个白方格;用小方格表示单元内容;个白方格;用小方格表示单元内容;色彩表示数据类型,由于仅色彩表示数据类型,由于仅A(2,1)单元的内容为字符型,所以单元的内容为字符型,所以它的颜色与其余均为数值型的单元内容的颜色不同。它的颜色与其余均为数值型的单元内容的颜色不同。注意:注意:对于单元数组来说
12、,单元和单元里的内容是两个对于单元数组来说,单元和单元里的内容是两个完全不同的范畴。因此,寻访单元和寻访单元内容是两完全不同的范畴。因此,寻访单元和寻访单元内容是两种不同的操作。以二维单元数组为例,种不同的操作。以二维单元数组为例,A(4,2)是)是A单单元数组中的第元数组中的第4行第行第2列单元元素;而列单元元素;而A4,2是指是指A单元单元 数组中的第数组中的第4行第行第2列单元中所允许存取的内容。两者的列单元中所允许存取的内容。两者的区别仅是用圆括号或是用花括号。区别仅是用圆括号或是用花括号。第三节第三节 结构数组的建立结构数组的建立 结构数组可以采用直接建立的方法,此种方法是直接建立结
13、构数组可以采用直接建立的方法,此种方法是直接建立结构的各个域,同时给各域赋值,结构和域之间用点连接。在结构的各个域,同时给各域赋值,结构和域之间用点连接。在访问结构数组的各个域时,也是访问结构数组的各个域时,也是“结构数组名结构数组名.域名域名”的格式。的格式。当结构带有子域时,需完整地键入结构名、域名、子域名,才当结构带有子域时,需完整地键入结构名、域名、子域名,才能显示域中的内容。结构数组的各个域可以按照其本身的数据能显示域中的内容。结构数组的各个域可以按照其本身的数据类型进行相应的各种运算。类型进行相应的各种运算。【例【例3-8】采用直接法建立一个结构数组。采用直接法建立一个结构数组。e
14、xperiment.name=FFT频谱分析频谱分析;experiment.place=数字信号处理实验室数字信号处理实验室;experiment.grade=电子电子0541班班;experiment.grade.group=24组组;experimentexperiment=name:FFT频谱分析频谱分析 place:数字信号处理实验室数字信号处理实验室 grade:1x1 struct experiment.placeans=数字信号处理实验室数字信号处理实验室 experiment.gradeans=group:24组组 experiment.grade.groupans=24组组
15、除了上面的直接建立法外,除了上面的直接建立法外,Matlab还提供了函数还提供了函数structure创建结构数组的,其调用格式如下:创建结构数组的,其调用格式如下:S=struct(field1,values1,field2,values2,.)使用指定的域使用指定的域名和各个域的数据建立结构数组。名和各个域的数据建立结构数组。如果数组中包含有多个结构,各个结构域中的数据又不尽如果数组中包含有多个结构,各个结构域中的数据又不尽相同,则域的数据相同,则域的数据values1、values2必须是单元数组,建必须是单元数组,建立的结构数组和单元数组的大小相同。立的结构数组和单元数组的大小相同。【
16、例【例3-9】利用利用“structure”函数建立一个结构数组。函数建立一个结构数组。clears=struct(property,tall,short,age,old,young,skin,black)s=1x2 struct array with fields:property age skin第四节第四节 数字与字符串的相互转换数字与字符串的相互转换 在在Matlab中,有时需要我们把一个数值转换成一个字符中,有时需要我们把一个数值转换成一个字符串,或者把一个字符串转换成一个数值。串,或者把一个字符串转换成一个数值。Matlab提供了一系提供了一系列的函数来完成这些操作,如列的函数来完
17、成这些操作,如int2str、num2str、mat2str、sprintf和和fprintf等,如:等,如:A1=int2str(eye(4)%将整数转换成字符串将整数转换成字符串 A1=1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1%结果为字符型矩阵结果为字符型矩阵 size(A1)ans=4 10 A2=num2str(rand(3)%将数值转换成字符串将数值转换成字符串A2=0.95013 0.48598 0.45647 0.23114 0.8913 0.018504 0.60684 0.7621 0.82141 size(A2)ans=3 31 A3=mat2str(
18、pi/2*eye(2)%将矩阵转换成字符串将矩阵转换成字符串A3=1.5707963267949 0;0 1.5707963267949 size(A3)ans=1 37 除了以上三种函数以外,除了以上三种函数以外,Matlab还提供了还提供了fprintf和和sprintf两种转换两种转换函数,其名称和用法与函数,其名称和用法与C语言中的格式转换(语言中的格式转换(printf)类似。)类似。fprintf(%.4gn,sqrt(2)ans=1.414 sprintf(%.4g,sqrt(2)ans=1.414 size(ans)ans=1 5其中,其中,%.4n是字符显示时的格式声明,表明
19、显示是字符显示时的格式声明,表明显示4位有效位;位有效位;n是换行符。是换行符。在进行数据与字符串之间的转换时在进行数据与字符串之间的转换时,格式声明非常重要。下格式声明非常重要。下面以面以pi为例说明不同格式声明下的具体转换结果为例说明不同格式声明下的具体转换结果,见表见表3-1:表表3-1 3-1 数据与字符串转换时格式声明举例列表数据与字符串转换时格式声明举例列表命命 令令 格格 式式显显 示示 结结 果果sprintf(%.0e,pi)3e+000sprintf(%.1e,pi)3.1e+000sprintf(%.3e,pi)3.142e+000sprintf(%.5e,pi)3.14
20、159e+000sprintf(%.10e,pi)3.1415926536e+000sprintf(%.0f,pi)3sprintf(%.1f,pi)3.1sprintf(%.3f,pi)3.142sprintf(%.5f,pi)3.14159sprintf(%.10f,pi)3.1415926536sprintf(%.0g,pi)3sprintf(%.1g,pi)3sprintf(%.3g,pi)3.14sprintf(%.5g,pi)3.1416sprintf(%.10g,pi)3.141592654sprintf(%8.0g,pi)3sprintf(%8.1g,pi)3sprintf(%
21、8.3g,pi)3.14sprintf(%8.5g,pi)3.1416sprintf(%8.10g,pi)3.141592654 其中,参数其中,参数e表示转换成指数形式,参数表示转换成指数形式,参数f表表示带有多少个小数位,参数示带有多少个小数位,参数g表示使用表示使用e或或f中较短中较短的表达式。需要注意的是,对于的表达式。需要注意的是,对于e和和f,小数点右边,小数点右边的数字表示在小数点后要显示多少位的数字表示在小数点后要显示多少位,而对于而对于g来说,来说,小数点右边的数字表示总共显示多少位。表小数点右边的数字表示总共显示多少位。表3-1的的后后5种表示中,小数点前面的数字指定了种表
22、示中,小数点前面的数字指定了8个字符个字符的宽度,显示结果右对齐。比较特殊的是最后一的宽度,显示结果右对齐。比较特殊的是最后一行中,显示宽度超过了行中,显示宽度超过了8,这是由于小数点后面指,这是由于小数点后面指定显示的位数是定显示的位数是10。函数名函数名功能描述功能描述例子例子char把一个数值截取小数部分把一个数值截取小数部分,然后转换为等值的字符然后转换为等值的字符72 105Hiint2str把一个数值的小数部分四舍无入把一个数值的小数部分四舍无入,然后转换为字符然后转换为字符串串72 10572 105num2str把一个数值类型的数据转换为字符串把一个数值类型的数据转换为字符串7
23、2 10572/105/(输出格式(输出格式为为%ld/)mat2str把一个数值类型的数据转换为字符串把一个数值类型的数据转换为字符串,返回的结果返回的结果是是MatlabMatlab 7 7能识别的格式能识别的格式72 105 72 105dec2hex把一个正整数转换为十六进制的字符串表示把一个正整数转换为十六进制的字符串表示72 10548 69dec2bin把一个正整数转换为二进制的字符串表示把一个正整数转换为二进制的字符串表示72 1051001000 1101001dec2base把一个正整数转换为任意进制的字符串表示把一个正整数转换为任意进制的字符串表示72 105110151
24、(八进制)(八进制)表表3-2 数值转换为字符串的函数数值转换为字符串的函数 在在Matlab中,不仅提供了将数值转换成字符串的函数,同中,不仅提供了将数值转换成字符串的函数,同时也提供了一系列逆操作函数,如时也提供了一系列逆操作函数,如str2num函数、函数、str2double函函数以及数以及sscanf函数等等。下面我们开始讨论将字符串转换成数函数等等。下面我们开始讨论将字符串转换成数值函数的具体用法。值函数的具体用法。首先介绍一下函数首先介绍一下函数num2str逆操作逆操作str2num的用法。的用法。s=num2str(log(3)*eye(3)s=1.0986 0 0 0 1.
25、0986 0 0 0 1.0986 ischar(s)%判定判定s是否为字符串数组,如果是,返回逻是否为字符串数组,如果是,返回逻辑值辑值1,否则,返回逻辑值否则,返回逻辑值0ans=1 n=str2num(s)n=1.0986 0 0 0 1.0986 0 0 0 1.0986 isnumeric(n)%判定判定n是否为数值数组是否为数值数组ans=1 isfloat(n)%判定判定n是否为浮点数值数组是否为浮点数值数组ans=1 A=log(3)*eye(3)-nA=1.0e-004*0.1229 0 0 0 0.1229 0 0 0 0.1229 函数函数str2num可以对一个表达式的
26、值进行转换,但该表达可以对一个表达式的值进行转换,但该表达式中不能包含工作区中的变量。式中不能包含工作区中的变量。下面介绍函数下面介绍函数sprintf的逆操作的逆操作sscanf函数用法,函数函数用法,函数sscanf可以根据格式指示符从一个字符串中读取数据。可以根据格式指示符从一个字符串中读取数据。v=version%获取获取Matlab版本信息版本信息v=7.1.0.246(R14)Service Pack 3 sscanf(v,%f)%获取浮点数值获取浮点数值ans=7.1000 0 0.2460 sscanf(v,%f,1)%获取浮点数值第一项获取浮点数值第一项ans=7.1000
27、sscanf(v,%d)%获取整数数值获取整数数值ans=7 sscanf(v,%s)%获取字符串获取字符串ans=7.1.0.246(R14)ServicePack3函数函数str2double的用法的用法 clear c=8.693*exp(2);-38.565;3.327;d=str2double(c)d=NaN -38.5650 3.3270 whos Name Size Bytes Class c 3x1 228 cell array d 3x1 24 double arrayGrand total is 30 elements using 252 bytesMatlab 7为用户提
28、供的将字符串转换数值的函数如表为用户提供的将字符串转换数值的函数如表3-3所示:所示:表表3-3 字符串转换为数值的函数字符串转换为数值的函数函数名函数名功功 能能 描描 述述例例 子子uintN把字符转换为等值的整数把字符转换为等值的整数Hi72 105 str2num把一个字符串转换为数值类型把一个字符串转换为数值类型72 105 72 105str2double与与str2num相似相似,但比但比str2num性能优越性能优越,同时提供同时提供对单元字符数组的支持对单元字符数组的支持72105 72 105hex2num把一个把一个IEEE格式的十六进制字符串转换为数值格式的十六进制字符
29、串转换为数值类型类型40092fb54442d18 pihex2dec把一个把一个IEEE格式的十六进制字符串转换为整数格式的十六进制字符串转换为整数12B 299bin2dec把一个二进制字符串转换为十进制整数把一个二进制字符串转换为十进制整数010111 23base2dec把一个任意进制的字符串转换为十进制整数把一个任意进制的字符串转换为十进制整数12 10(八进制)(八进制)第五节第五节 字符串函数字符串函数 Matlab提供了许多与字符串有关的函数。提供了许多与字符串有关的函数。下面通过几个示例对表中的部分函数进行说明。下面通过几个示例对表中的部分函数进行说明。C=Is this a
30、 string?;%建立一个字符串数组建立一个字符串数组 ischar(C)%判断判断C 是一个字符串数组吗是一个字符串数组吗 ans=1%结果为真结果为真 C=1 1 1;3 3 3;%建立一个字符串数组建立一个字符串数组 ischar(C)%判断判断C 是一个字符串数组吗是一个字符串数组吗ans=0%结果为假结果为假 S=Find another string in a longer string.;%建立一建立一 个字符串数组个字符串数组 result1=findstr(S,longer)%查找查找“longer”的位置的位置Result1=26 result2=findstr(S,a)
31、%查找查找“a”的位置的位置 result2=6 24 result3=findstr(S,b)%查找查找“b”的位置,由于的位置,由于S中中 没有没有“b”,所以返回值为空,所以返回值为空 result3=S=find another string in a longer string.;upper(S)%将字符串转换成大写字母将字符串转换成大写字母 ans=FIND ANOTHER STRING IN A LONGER STRING.S=FIND ANOTHER STRING IN A LONGER STRING.;lower(S)%将字符串转换成小写字母将字符串转换成小写字母 ans=f
32、ind another string in a longer string.第四章第四章 Matlab数值运算基础数值运算基础 多项式多项式运算运算 数据数据插值插值 数据分析数据分析第一节第一节 多项式运算多项式运算一、多项式创建一、多项式创建 二二、多项式求值和求根、多项式求值和求根 三三、多项式乘法和除法、多项式乘法和除法 四四、多项式的微分和积分、多项式的微分和积分 五五、多项式曲线拟合、多项式曲线拟合一、多项式创建一、多项式创建1.系数矢量直接输入法系数矢量直接输入法 【例【例4-1】在】在Matlab中,将中,将多项式多项式x5-5x4-4x3+3x2-2x+1用用 行向量行向量表
33、示如下:表示如下:p=1 -5 -4 3 -2 1 p=1 -5 -4 3 -2 1 y=poly2sym(p)y=x5-5*x4-4*x3+3*x2-2*x+1【例【例4-2】某多项式的行矢量】某多项式的行矢量 p=1 0 3 2 -1,创建与之,创建与之 相相对应的多项式。对应的多项式。p=1 0 3 2 -1;y=poly2sym(p)y=x4+3*x2+2*x-12.由根矢量创建多项式,用函数由根矢量创建多项式,用函数poly实现。实现。【例【例4-3】根矢量】根矢量r=0 1 2,创建对应此根矢量的,创建对应此根矢量的多项多项 式式。r=0 1 2;p=poly(r)p=1 -3 2
34、 0 y=poly2sym(p)y=x3-3*x2+2*x【例【例4-4】根矢量】根矢量 r=2 -1+i -1-i,创建对应此根,创建对应此根 的多项式。的多项式。r=2 -1+i -1-i;p=poly(r)p=1 0 -2 -4 y=poly2sym(pr)y=x3-2*x-41.多项式求值,调用格式如下:多项式求值,调用格式如下:y=polyval(p,x)y=polyvalm(p,x)通过通过示例观察示例观察polyval和和polyvalm的用法。的用法。二、多项式求值和求根二、多项式求值和求根 【例【例4-5】求多项式】求多项式 2x3+2x+1在在0、1、2处的值。处的值。p=
35、2 0 2 1;pv=polyval(p,0 1 2)pv=1 5 21 【例【例4-6】求多项式】求多项式2x3+2x+1 对于矩阵对于矩阵1 0;0 1及及 标量标量5的值。的值。p=2 0 2 1;pv1=polyvalm(p,1 0;0 1)pv1=5 0 0 5 pv2=polyvalm(p,5)pv2=261 pv3=polyval(p,5)pv3=261 可见,多项式在一点的值,既可以用可见,多项式在一点的值,既可以用polyval,也可以用,也可以用polyvalm。【例【例4-7】求多项式求多项式2x3+2x+1的根。的根。p=2 0 2 1;r=roots(p)r=0.21
36、19+1.6052i 0.2119-1.0652i -0.43292.多项式求根多项式求根 多项式求根用函数多项式求根用函数roots实现实现。多项式多项式的乘、除法分别用函数的乘、除法分别用函数conv和和deconv来实现。来实现。【例【例4-8】求多项式】求多项式a(x)=x3+x+1和和b(x)=x2-1的乘积。的乘积。a=1 0 1 1;b=1 0 -1;c=conv(a,b)c=1 0 0 1 -1 -1 cx=poly2sym(c)三、多项式乘法和除法三、多项式乘法和除法 cx=x5+x2-x-1【例【例4-9】求多项式】求多项式a(x)=x6+6x5+20 x4+50 x3+7
37、5x2+84x+64与与 b(x)=x3+4x2+9x+16的除法运算的除法运算a(x)/b(x)。a=1 6 20 50 75 84 64;b=1 4 9 16;d=deconv(a,b)d=1 2 3 4 dx=poly2sym(c)dx=x3+2*x2+3*x+4 多项式多项式的微分和积分分别用的微分和积分分别用polyder和和polyint实现。实现。【例【例4-10】求多项式求多项式4x3+3x2-2x+1的微分和积分。的微分和积分。p=4 3 -2 1;polyder(p)ans=12 6 -2 poly2sym(ans)四、多项式的微分和积分四、多项式的微分和积分ans=12*
38、x2+6*x-2 polyint(p)ans=1 1 -1 1 0 poly2sym(ans)ans=x4+x3-x2+x 【例【例4-11】对数据对数据 x=0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1和和y=-0.232 0.647 1.877 3.565 5.134 7.443 9.221 10.011 11.678 12.566 13.788做二次曲线拟合,做二次曲线拟合,并并图示拟合曲线和原来的数据。图示拟合曲线和原来的数据。x=0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1;五、多项式曲线拟合五、多项式曲线拟合 y=
39、-0.232 0.647 1.877 3.565 5.134 7.443 9.221 10.011 11.678 12.566 13.788;p=polyfit(x,y,2);x1=linspace(0,1,50);y1=polyval(p,x1);plot(x,y,o,x1,y1)得到得到的图形如图的图形如图4-1所示:所示:图图4-1 原数据与二次曲线拟合结果比较原数据与二次曲线拟合结果比较 【例【例4-12】对例对例4-11的数据的数据x和和y做做9阶多项式曲线阶多项式曲线 拟合,并图示原来的数据、二次曲线拟合、拟合,并图示原来的数据、二次曲线拟合、9阶曲线拟阶曲线拟 合结果合结果。图图
40、4-2 4-2 原数据、二阶曲线拟合与九阶曲线拟合结果比较原数据、二阶曲线拟合与九阶曲线拟合结果比较第二节第二节 数据插值数据插值一、一维插值一、一维插值二、二维插值二、二维插值一、一维插值一、一维插值【例【例4-13】在在-2,2区间上分别用区间上分别用5个数据点和个数据点和50 个数据点绘制抛物线函数个数据点绘制抛物线函数y=x2的图形的图形。x1=linspace(-2,2,5);x2=linspace(-2,2,50);y1=x1.2;y2=x2.2;plot(x1,y1,x2,y2)图图4-3 抛物线的抛物线的5个数据点和个数据点和50个数据点的一维插个数据点的一维插值值 数据的一维
41、插值函数是数据的一维插值函数是interp1,它的调用格式:,它的调用格式:S=interp1(x,y,xi,linear)S=interp1(x,y,xi,cubic)S=interp1(x,y,xi,spline)S=interp1(x,y,xi,nearest)【例【例4-14】以例以例4-13为例,用为例,用4种插值方法重新画抛物线。种插值方法重新画抛物线。x=linspace(-2,2,5);y=x.2;xi=linspace(-2,2,50);strcell=linear,cubic,spline,nearest;for i=1:4 yi=interp1(x,y,xi,strcel
42、l i);subplot(2 ,2 ,i)plot(x,y,ok,xi,yi,g)End图图4-4 一维插值的四种方法一维插值的四种方法提示:由于在很多情况下,三次样条插值方法的插值提示:由于在很多情况下,三次样条插值方法的插值 效果最好,所以效果最好,所以Matlab专门提供了三次样条插专门提供了三次样条插 值函数值函数spline。spline函数计算的结果与函数计算的结果与interp1 函数中使用函数中使用spline方法所得到的结果是相同的。方法所得到的结果是相同的。spline的调用格式为:的调用格式为:spline(x,y,xi),x 和和y是原始数据,是原始数据,xi是插值点的
43、自变量矢量。是插值点的自变量矢量。二、二维插值二、二维插值 二维插值函数调用格式为:二维插值函数调用格式为:ZI=interp2(X,Y,Z,XI,YI,method)其中其中X,Y是插值前的自变量数组,是插值前的自变量数组,XI,YI是是X,Y被被插值后重新组合生成的维数相同的新数组。插值后重新组合生成的维数相同的新数组。“method”是插值方法,与是插值方法,与一维插值的一维插值的4种方法相同。下面我们通种方法相同。下面我们通过一个测绘实例来说明一下二维插值的基本原理。过一个测绘实例来说明一下二维插值的基本原理。【例【例4-15】假设某勘测公司要对某山峰的地形进行勘测,假设某勘测公司要对
44、某山峰的地形进行勘测,勘测人员将测量的地域用勘测人员将测量的地域用0.4公里宽的方形格栅公里宽的方形格栅 分成不同的区域,并在格栅和每个交点处记录下测量分成不同的区域,并在格栅和每个交点处记录下测量 的山峰高度(单位的山峰高度(单位Km)以便日后分析。部分测量数)以便日后分析。部分测量数 据如下据如下:x=0:0.4:2;%x轴的轴的6个坐标点数个坐标点数 y=0:0.4:4;%y轴的轴的11个坐标点数个坐标点数z=1 0.99 1 0.99 1 0.98 1 0.98 0.99 0.98 1 0.99 0.99 0.99 0.98 0.99 1 0.99 1 0.98 0.97 0.97 0
45、.99 0.99 1.01 1 0.98 0.98 1 1.02 102 1.03 1.01 1 1.02 1.06 099 1.02 1 1 1.03 1.08 0.97 0.99 1 1 1.02 1.05 1 1.02 1.03 1.02 1.01 1.01 1 1 1.01 1.01 1 1 1 1 1 0.99 0.99 1 mesh(z)%原始数据生成的三维图形原始数据生成的三维图形 原始数据生成的三维图形原始数据生成的三维图形平面上坐标为(平面上坐标为(1.1,2.2)处山峰的高度:)处山峰的高度:z=interp2(x,y,z,1.1,2.2)z=1.0013即在平面(即在平面
46、(1.1,2.2)坐标处,山峰的高度是)坐标处,山峰的高度是1.0013Km。为了使之平滑化,需对为了使之平滑化,需对x轴和轴和y轴进行插值轴进行插值细化,细化,x轴和轴和y轴的插值点分别为:轴的插值点分别为:xi=linspace(0,2,30);%x轴的轴的30个坐标点数个坐标点数yi=linspace(0,4,40);%y轴的轴的40个坐标点数个坐标点数 xx,yy=meshgrid(xi,yi);zz=interp2(x,y,z,xx,yy);mesh(zz)图图 4-5 二维插值前后的效果比较图二维插值前后的效果比较图 重新求平面上(重新求平面上(1.1,2.2)处山峰高度,命令)处
47、山峰高度,命令如下:如下:z=interp2(xx,yy,zz,1.1,2.2)z=1.0183 即在平面(即在平面(1.1,2.2)坐标处,山峰)坐标处,山峰的高度是的高度是1.0183Km。由图由图4-5的第二个图可见的第二个图可见,通过二维插值使山峰高度的三维图形通过二维插值使山峰高度的三维图形变得更加平滑,因此可以得到平面上某点所对应的更精确的山峰高变得更加平滑,因此可以得到平面上某点所对应的更精确的山峰高度度。提示:本例仅用了缺省提示:本例仅用了缺省linearlinear插值法,读者可以尝试另外的三种插值法,读者可以尝试另外的三种 方法,在此不再赘述。方法,在此不再赘述。第三节第三
48、节 数据分析数据分析 例【例【4-16】某商场某商场4个营业部一年(个营业部一年(12个月)的消售额个月)的消售额 (单(单 位:万元)存在位:万元)存在M文件的文件的sale数组中,文件名为数组中,文件名为sale.m,在命令窗口运行该文件,即有在命令窗口运行该文件,即有:sale=30 32 50 40 50 51 60 50 20 21 48 37 25 24 40 29 35 34 37 28 30 28 30 31 28 30 32 42 22 24 30 37 21 20 26 38 27 25 23 25 23 24 25 26 22 22 24 27 bar(sale)xlab
49、el(month of year);ylabel(sale of Deps);图图4-6 4个营业部的年销售条形图个营业部的年销售条形图1 提示提示:条形图命令在第五章有详细介绍。:条形图命令在第五章有详细介绍。图图4-7 44-7 4个营业部的年销售条形图个营业部的年销售条形图2 2saleflip=sale;bar(saleflip)(1)4个营业部年平均营业额,代码个营业部年平均营业额,代码为:为:avgsale1=mean(sale)avgsale1=27.7500 27.9167 35.4167 34.1667avgsale=mean(savgsale1)avgsale=31.312
50、5 (2)4个营业部每月的平均营业额,代码个营业部每月的平均营业额,代码为:为:avgsale2=mean(sale,2)avgsale2=38.0000 52.7500 .23.7500 由此可见,其中,由此可见,其中,“1”代表对列求平均值(默认)。代表对列求平均值(默认)。“2”代表对行求平均值。代表对行求平均值。(3)下面给出)下面给出avgsale1和和avgsale2的条形图,并将其分别的条形图,并将其分别 叠加在叠加在bar(saleflip)和和bar(sale)上,来比较一下上,来比较一下4个营个营 业部的月销售额与月平均销售额、年销售额与年平业部的月销售额与月平均销售额、年