《第二讲MATLAB数据结构.ppt》由会员分享,可在线阅读,更多相关《第二讲MATLAB数据结构.ppt(145页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、MATLAB软件基础软件基础第二章数组及其运算MATLAB数组类型包括:数值数组、数组类型包括:数值数组、字符串数组、元胞数组(字符串数组、元胞数组(CellArray)和和结构数组(结构数组(StructureArray)等。在数值等。在数值计算方面,数值数组(矩阵)及其运算计算方面,数值数组(矩阵)及其运算(ArrayOperation)始终是始终是MATLAB的的核心内容。但伴随着数值计算的需要和核心内容。但伴随着数值计算的需要和发展,其它类型的数组逐步被引进和发发展,其它类型的数组逐步被引进和发展,对数值数组提供了强有力的支持。展,对数值数组提供了强有力的支持。本章将详细讨论这四种类型
2、的数据。本章将详细讨论这四种类型的数据。MATLAB数组类型数组类型MATLABV6.1版的数据类型1数值数组数值数组是由一组实数或复数按一定顺序排成列阵(array),这些实数或复数称为数组的元素,它们在数组中的顺序用自然数表示,称为数组元素的下标。一维数组为如下形式的列阵称为数组的第i个元素,i为元素的单下标。按上面的写法,一维数组称为行向量。若从上到下竖着写,此时称为(列)向量。1数值数组二维数组为如下形式的列阵二维数组为如下形式的列阵1数值数组称为数组的第i行第j列元素,顺序依照:按列从上到下、按行从左到右的规则,这样列阵中每一元素的位置用两个自然数确定,这里的m和n表示这个数组的规模
3、。在数学上二维数组称为矩阵。三维数组三维数组可看为同等规模的二维数组(矩阵)的“叠合”。四维数组四维数组可看成同等规模的三维数组的“叠合”。1数值数组三维数组示意图页页三维数组:行三维数组:行列列页页1数值数组更高维数的数组可以类似地规定。这里的“维数”是指数组元素在该数组定位时所需自然数的个数,即下标个数。这与数学上向量空间里“维数”的定义不一样。数组运算是指:在对数组施加的各种运算(加、减、乘、除或求函数值运算)时,该运算对数组中每个元素平等地实施同样的操作。1数值数组【例2.1.1】计算函数在等距节点上的值。x=0:0.1:1%定义一个代表节点的一维数组y=x.*exp(-x)%先对x的
4、每个元素计算指数函数值,得到一新数组,然后x的每个元素再与此新数组对应元素相乘。显示的结果为:1数值数组x=Columns1through700.10000.20000.30000.40000.50000.6000Columns8through110.70000.80000.90001.0000y=Columns1through700.09050.16370.22220.26810.30330.3293Columns8through110.34760.35950.36590.36791.1一维数组的创建和寻访1.1.1创建创建逐个元素输入法x=2 pi/2 sqrt(3)3+5i%元素间用空格
5、或逗号分隔。x=2.0000 1.5708 1.7321 3.0000+5.0000i1.1一维数组的创建和寻访冒号生成法格式为:x=a:step:b。这里step称为步长,缺省值是1;step为正数时,a要大于b,反之a要小于b。a是数组的第一个元素,最后的元素不超过b。这里的“:”是英文状态下的。x=1:5y=1.1:5z=0:pi/4:pi显示结果如下:1.1一维数组的创建和寻访x=12345y=1.10002.10003.10004.1000z=00.78541.57082.35623.14161.1一维数组的创建和寻访线性等分法调用格式:x=linspace(a,b,n)。生成一个等
6、距的维数为n的行向量,x(1)=a,x(n)=b。当n缺省时,n=100。如x=linspace(1,5,5),则x=12345。对数等分法格式为:x=logspace(a,b,n)。生成一个指数为等距的维数为n的行向量,x(1)=10a,x(n)=10b。缺省时,n=50。它还有一特殊用法x=logspace(a,pi),生成一维数为50的行向量,满足x(1)=10a,x(50)=10b=pi。1.1一维数组的创建和寻访1.1.2数组寻访(寻访(Address寻址)寻址)【例2.1.2】子数组的寻访x=1.1,2.1,3.1,4.1,5.1,6.1,7.1,8.1;%定义向量xx(4)%寻访
7、数组x的第四个元素ans=4.1000 x(1:4)%寻访数组的前四个元素组成的子数组ans=1.10002.10003.10004.10001.1一维数组的创建和寻访x(6:end)%寻访数组的第六个元素到最后一个元素组成的子数组,end代表最后一个元素的下标ans=6.10007.10008.1000 x(1,3,5)%寻访数组的第一、三、五个元素组成的子数组ans=1.10003.10005.10001.1一维数组的创建和寻访x(3:-1:1)%由前三个元素倒排构成的子数组ans=3.10002.10001.1000 x(find(x5)%由大于5的元素构成的子数组ans=5.10006
8、.10007.10008.10001.1一维数组的创建和寻访x(234432333444)%对元素可以重复寻访,且所得数组长度可以大于原数组的长度。ans=Columns1through62.10003.10004.10004.10003.10002.1000Columns7through123.1000 3.1000 3.1000 4.1000 4.1000 4.10001.1一维数组的创建和寻访说明:MATLAB是根据下标(index)寻访子数组的。下标本身可以是单个正整数或正整数数组,它的元素取值介于1和end(一维数组的长度)之间。对子数组也可重新赋值,如对上面例子的数组x,令x(3)
9、=0则将x的第三个元素重新赋值为01.1一维数组的创建和寻访x(14end)=pipipi%重新赋值的子数组要保证与被送入的数组长度相同。以下为显示结果:x=Columns1through73.14162.100003.14165.10006.10007.1000Column83.14161.2二维数组的创建和寻访1.2.1创建创建从数据结构上看,二维数组和矩阵没有什么区别。当二维数组带有线性变换的含义时,它就是矩阵。直接输入法(方括号法)利用M文件创建和保存数组大规模的数组用此方法比较方便,实质上是用一条赋值语句创建一个M文件,见下例。1.2二维数组的创建和寻访【例2.1.3】利用M文件创建
10、和保存数组示例首先打开文件编辑器,输入如下内容:AM=101,102,103,104,105,106,107,108,109;.201,202,203,204,205,206,207,208,209;.301,302,303,304,305,306,307,308,309;然后以MyMatrix.m为文件名,保存此文件。最后在MATLAB指令窗中运行此文件,则变量AM就驻存在MATLAB工作内存中。1.2二维数组的创建和寻访1.2.2二维数组元素的标识法和寻访二维数组元素的标识法和寻访全下标(或双下标)标识法(doublesubscript)单下标标识法(index索引,)两种标识法之间的转换
11、sub2ind(据 全 下 标 换 算 出 单 下 标)和ind2sub(由单下标算出全下标)。A(p)p=(j-1)m+iA(i,j),A是mxn矩阵。全下标和单下标寻访(适用于高维数组)1.2二维数组的创建和寻访子数组(子矩阵)的寻访和赋值子数组(子矩阵)的寻访和赋值【例2.1.4】子数组寻访和赋值的示例A=1,2,3,4,5;6,7,8,9,10;11,12,13,14,15A=1234567891011121314151.2二维数组的创建和寻访a24=A(2,4)%单元素全下标寻访,显示结果如下:a24=9%等价于单下标寻访A(4-1)*3+2)r=1,3;c=1,3,5;Arc=A(
12、r,c)%由r和c所指定元素构成的子数组,结果如下:Arc=1351113151.2二维数组的创建和寻访A14=A(1:2,4:5)%由1:2和4:5所指定元素构成的子数组,结果如下:A14=45910Ac=A(:,c)%由c指定列和所有行的元素构成的子数组,结果如下:Ac=13568101113151.2二维数组的创建和寻访Ar=A(r,:)%由r指定行和所有列的元素构成的子数组,结果如下:Ar=123451112131415A(:)%A(:)单下标寻访,各列列按按自左到右的次序首尾相连而成一维列数组列数组。1.2二维数组的创建和寻访ans=Columns1through1116112712
13、381349Columns12through151451015s=1,3,5,7,9;A(s)%单下标寻访,生成由s指定的一维数组,结果如下:1.2二维数组的创建和寻访ans=1117313A(3,:)=0,0,0,0,0%全下标方式对子数组A(3,:)赋值,结果如下:A=12345678910000001.2二维数组的创建和寻访A(1:2,2:5)=0,0,0,0;0,0,0,0%全下标时,注意与子数组的规模一致。A=0000000000000001.2二维数组的创建和寻访A(:)=1:15%单下标赋值,注意与子数组元素总数一致。(全元素赋值法)A=147101325811143691215
14、1.2二维数组的创建和寻访数组的单下标全元素赋值法当二维数组采用单下标标识时,它可看为一维数组,这样就可以用一维数组的标识方式进行赋值,这种赋值方法称为单下标全元素赋值法。注意:赋值时,相应的总元素数要相同。例如上例中倒数第一和三条语句,下面再看一例:【例2.1.5】不同的赋值方式示例。1.2二维数组的创建和寻访A=1357911;24681012A=135791124681012B=zeros(3,4)%创建34的全零数组。B=0000000000001.2二维数组的创建和寻访s=2468%创建一维下标数组。s=2468B(s)=A(s)%子数组赋值。B=0400208006001.2二维数
15、组的创建和寻访B(:)=A(:)%数组赋值,将A的元素按B的规模赋予B。元素总数相同。B=147102581136912A(s)=0.5%单元素的子数组赋值。A=1.00003.00005.00007.00009.000011.00000.50000.50000.50000.500010.000012.00001.3数组运算和矩阵运算数组运算是MATLAB软件所定义的运算规则,其目的是为了数据管理方便、操作简单、指令形式自然和执行计算的有效。MATLAB引进了数学中的矩阵的运算规则,进而使得该软件应用起来更加方便。这两种运算如下表2.1.1所示。1.3数组运算和矩阵运算表表2.1.1数组和矩阵
16、运算表数组和矩阵运算表1.4数组(矩阵)生成函数和操作函数MATLAB提供了一些生成和操作函数,它们极大地方便了用户。参见表2.1.2和2.1.3。1.4数组(矩阵)生成函数和操作函数表2.1.2数组(矩阵)生成函数注:带有“*”号表明该函数只适用于二维数组(矩阵),下同。用户可以利用在线帮助查询这些函数的详细使用方法。1.4数组(矩阵)生成函数和操作函数【例2.1.6】矩阵生成函数示例。M=magic(4)%各行、各列和对角元素的总和分别相等的矩阵。M=162313511108976124141511.4数组(矩阵)生成函数和操作函数ML=tril(M)%M的下三角元素组成的下三角矩阵。ML
17、=16000511009760414151M0=zeros(3,3)%三行三列的全0矩阵。M0=0000000001.4数组(矩阵)生成函数和操作函数M1=ones(4,5)%45的全1矩阵。M1=111111111111111111111.4数组(矩阵)生成函数和操作函数M1U=triu(M1)%M1的上三角矩阵。M1U=111110111100111000111.4数组(矩阵)生成函数和操作函数M1U(1:3,3:5)=M0%子矩阵的赋值M1U=110000100000000000111.4数组(矩阵)生成函数和操作函数d=diag(M1U)%提取M1U的对角线上元素(组成列向量),然后转
18、置。d=1101diag(d)%利用行向量d生成对角矩阵。ans=10000100000000011.4数组(矩阵)生成函数和操作函数randn(state,1)%把正态随机数发生器置1。Rn=randn(2,4)%产生24的正态随机矩阵。Rn=0.8644-0.8519-0.4380-1.10270.09420.8735-0.42970.39621.4数组(矩阵)生成函数和操作函数表2.1.3数组(矩阵)操作函数1.4数组(矩阵)生成函数和操作函数【例2.1.7】矩阵操作函数示例。a=1:16;A=reshape(a,2,8)%将一维数组变形成28数组。A=13579111315246810
19、1214161.4数组(矩阵)生成函数和操作函数B=reshape(A,4,4)%将28矩阵变形成44矩阵。B=159132610143711154812161.4数组(矩阵)生成函数和操作函数C=repmat(B,1,2)%将B排列成12的分块矩阵(规模更大的48矩阵)。C=15913159132610142610143711153711154812164812161.4标准数组(矩阵)生成函数和操作函数D=repmat(A,2,1)%将A排列成21的分块矩阵(规模更大的48矩阵)。D=13579111315246810121416135791113152468101214161.4标准数组
20、(矩阵)生成函数和操作函数【例2.1.8】转置、对称交换和旋转操作对照示例。A=reshape(1:12,3,4)A=1471025811369121.4标准数组(矩阵)生成函数和操作函数B=eye(3,4)B=1000010000101.4标准数组(矩阵)生成函数和操作函数C=A+B*iC=1.0000+1.0000i4.00007.000010.00002.00005.0000+1.0000i8.000011.00003.00006.00009.0000+1.0000i12.00001.4标准数组(矩阵)生成函数和操作函数C%C的共轭转置ans=1.0000-1.0000i2.00003.
21、00004.00005.0000-1.0000i6.00007.00008.00009.0000-1.0000i10.000011.000012.00001.4标准数组(矩阵)生成函数和操作函数C.%C的转置ans=1.0000+1.0000i2.00003.00004.00005.0000+1.0000i6.00007.00008.00009.0000+1.0000i10.000011.000012.00001.4标准数组(矩阵)生成函数和操作函数C=1.0000+1.0000i4.00007.000010.00002.00005.0000+1.0000i8.000011.00003.000
22、06.00009.0000+1.0000i12.0000flipud(C)%上下对称交换ans=3.00006.00009.0000+1.0000i12.00002.00005.0000+1.0000i8.000011.00001.0000+1.0000i4.00007.000010.00001.4标准数组(矩阵)生成函数和操作函数C=1.0000+1.0000i4.00007.000010.00002.00005.0000+1.0000i8.000011.00003.00006.00009.0000+1.0000i12.0000fliplr(C)%左右对称交换ans=10.00007.000
23、04.00001.0000+1.0000i11.00008.00005.0000+1.0000i2.000012.00009.0000+1.0000i6.00003.00001.4标准数组(矩阵)生成函数和操作函数rot90(C)%逆时针旋转90度ans=10.000011.000012.00007.00008.00009.0000+1.0000i4.00005.0000+1.0000i6.00001.0000+1.0000i2.00003.0000C=1.0000+1.0000i4.00007.000010.00002.00005.0000+1.0000i8.000011.00003.000
24、06.00009.0000+1.0000i12.00001.4标准数组(矩阵)生成函数和操作函数rot90(C,-1)%顺时针旋转1*90度ans=3.00002.00001.0000+1.0000i6.00005.0000+1.0000i4.00009.0000+1.0000i8.00007.000012.000011.000010.0000C=1.0000+1.0000i4.00007.000010.00002.00005.0000+1.0000i8.000011.00003.00006.00009.0000+1.0000i12.00001.4标准数组(矩阵)生成函数和操作函数【例2.1.
25、10】利用分块法创建一个矩阵。A=tril(ones(2),pi*eye(2),triu(0.5*ones(2);.zeros(3,1),reshape(1:9,3,3),ones(1,2);diag(0.4,0.8);B=repmat(A,1,2);1.5逻辑数组及其应用逻辑数组是一种特殊的数值数组,它的元素由0和1组成。既然它归属“数值类”,那么与“数值类”有关的操作和函数对它也同样适用;但它又不同于普通的“数值”,它还表示着对事物的判断结论“真”与“假”。因此,它有自身的特殊用途。下面通过例子介绍一下它的数组寻访功能。1.5逻辑数组及其应用【例例2.1.11】逻辑数组应用示例。】逻辑数组
26、应用示例。rand(state,5);A=rand(3,5)%0-1之间均匀分布的伪随机矩阵,结果如下:A=0.86390.85940.72930.39630.88270.90620.79600.54280.21370.81470.20010.33820.43020.13380.74531.5逻辑数组及其应用L=A=0.5%判断A中大于等于0.5的元素,生成一逻辑数组LL=1110111101000011.5逻辑数组及其应用B=A(L)%A(L):按L中“1”元素选出A的对应元素,按单下标排成列。%B为A中大于等于0.5的元素组成的一维数组(注意转置符号)。B=0.86390.90620.85
27、940.79600.72930.54280.88270.81470.74531.5逻辑数组及其应用C=A(L)%C为A中小于0.5的元素组成的一维数组(行向量)。C=0.20010.33820.43020.39630.21370.13381.5逻辑数组及其应用r,c=ind2sub(size(A),find(L);%等价于r,c=find(L),找出L中“1”元素的全下标。disp(r),disp(c)%第一行为行下标,第二行为列下标121212123112233555由此看出A(1,1)、A(2,1)、A(1,2)、A(2,2)、A(1,3)、A(2,3)、A(1,5)、A(2,5)和A(3
28、,5)为A中大于等于0.5的元素。【补例】补例】ind2sub应用示例。应用示例。P=pascal(4)P=1111123413610141020r,c=ind2sub(size(P),11)r=3c=31.6高维数组高维数组高维数组是指三维及三维以上的数组。对于二维数组,人们习惯地把数组的第一维称为“行(Row)”,把第二维称为“列(Column)”,至于第三维,称谓就不很统一,如“页(Page)”、“层(layer)”等。本文将采用“页”来称呼。1.6高维数组1.6.1高维数组的创建高维数组的创建高维数组最常用的创建方法如下:(1)直接通过“全下标”元素赋值方式创建高维数组(2)由若干同样
29、大小的低维数组组合成高维数组(3)由函数ones,zeros,rand,randn直接创建标准高维数组(4)借助cat,repmat,reshape等函数构作高维数组1.6.1高维数组的创建高维数组的创建(1)直接通过“全下标”元素赋值方式创建高维数组【例2.1.12】“全下标”元素赋值方式创建高维数组示例%单元素赋值创建232数组A(2,3,2)=12%A的第2行3列2页上的元素为12,其它元素自动赋0。%以下分别为第一和二页上的元素:(按页显示)1.6.1高维数组的创建A(:,:,1)=000000A(:,:,2)=00000121.6.1高维数组的创建再如:A(:,:,1)=1 0 3;
30、4 1 2;8 2 1;A(:,:,2)=6,8,3;4,3,6;5,9,2;1.6.1高维数组的创建1.6.1高维数组的创建%子数组赋值创建232数组B(2,3,1:2)=0,12%1至2页上的第2行3列元素分别为0和12。B(:,:,1)=000000B(:,:,2)=00000121.6.1高维数组的创建C(2,:,2)=1:3%第2行2页上的列元素为1,2和3。C(:,:,1)=000000C(:,:,2)=0001231.6.1高维数组的创建注意:创建高维数组时,若只给一部分位置赋值,则其它位置自动补0,且维数由下标个数来定,一般情况下,分别以二维数组显示,即分页显示,每一页显示一个
31、二维数组。1.6.1高维数组的创建(2)由若干同样大小的低维数组组合成高维数组【例2.1.13】由低维数组创建高维数组示例。clear;A=ones(2,3)%A为23二维数组A=1111111.6.1高维数组的创建A(:,:,2)=2*ones(2,3)%定义第二页,23数组,则A扩充为232数组,即通过增加一维(第三维,页),来扩充数组。A(:,:,1)=111111A(:,:,2)=2222221.6.1高维数组的创建A(:,:,5)=5*ones(2,3)%将A继续扩充为5页,为235数组,其它页补0。A(:,:,1)=111111A(:,:,2)=222222A(:,:,3)=000
32、000A(:,:,4)=000000A(:,:,5)=5555551.6.1高维数组的创建(3)由函数ones,zeros,rand,randn直接创建标准高维数组【例2.1.14】由创建函数创建标准的高维数组示例。rand(state,0);R=rand(3,5,2)1.6.1高维数组的创建R(:,:,1)=0.95010.48600.45650.44470.92180.23110.89130.01850.61540.73820.60680.76210.82140.79190.1763R(:,:,2)=0.40570.41030.35290.13890.60380.93550.89360.8
33、1320.20280.27220.91690.05790.00990.19870.19881.6.1高维数组的创建(4)借助cat,repmat,reshape等函数构作高维数组【例2.1.15】借助操作函数创建高维数组示例。A=ones(2);B=2*ones(2);C=3*ones(2);cat(1,A,B,C)%沿着第一维(行)的方向连接数组,得一62数组ans=1111222233331.6.1高维数组的创建cat(2,A,B,C)%沿第二维(列)的方向连接数组,得一26数组。ans=1122331122331.6.1高维数组的创建cat(3,A,B,C)%沿第三维(页)的方向连接数组
34、,得一223数组。ans(:,:,1)=1111ans(:,:,2)=2222ans(:,:,3)=33331.6.1高维数组的创建cat(4,A,B,C)%沿第四维方向连接数组,得一2213数组。ans(:,:,1,1)=1111ans(:,:,1,2)=2222ans(:,:,1,3)=3333ans(:,:,1,4)=44441.6.1高维数组的创建repmat(A,123)%沿第一维(行)铺一块,第二维(列)铺二块,第三维(页)铺三块,形成一个123三维数组。说说明明:B=REPMAT(A,MNP.)以A为元素生成一MNP.多维分块数组,这里A可以是多维的。具体生成方式为:沿第一维铺M
35、块,沿第二维铺N块,沿第三维铺P块,。ans(:,:,1)=11111111ans(:,:,2)=11111111ans(:,:,3)=111111111.6.1高维数组的创建reshape(1:12,2,2,3)说明:说明:RESHAPE(X,M,N,P,.)(或RESHAPE(X,MNP.))利用X的元素生成一MNP数组。X的元素总数PROD(SIZE(X)等于M*N*P*.。重组时遵循“单下标”方式,即先第一页按列向量排成一长列向量,然后接第二页,第三页如此下去,直到结束。ans(:,:,1)=1324ans(:,:,2)=5768ans(:,:,3)=91110121.6.2数组的维数
36、及规模数组的维数及规模.对 于 一 个 数 组 A,我 们 可 以 用 指 令ndims(A)和size(A)来查询它的维数和行、列、页等具体行列和页数目(即数组的规模)。【例2.1.16】数组的维数和规模的查询示例。A=2*ones(2);D=repmat(A,123);size(D)ans=2431.6.2数组的维数及规模.ndims(D)ans=3length(D)%给出各维的元素数目的最大值(长度)ans=41.6.2数组的维数及规模.高维数组的其它函数,如flipdim,permute,ipermute,shiftdim和squeeze等。关于它们的使用,用户可用在线帮助来查询。1.
37、7空数组和非数空数组和非数NaN空数组(或空矩阵)是MATLAB为操作和表达需要而专门设计的一种特殊数组。称某一维或若干维的长度为0的数组是“空”数组。1.7.1空数组的创建空数组的创建.创建空数组十分简单,例如:a=,b=ones(2,0),c=zeros(2,0,1),d=eye(6,0)和f=rand(2,3,0,4),它们分别创建了规模为0,20,201,60和2304的空数组。1.7.2空数组的使用空数组的使用【例2.1.17】缩小数组规模A=-4,-2,0,2,4;-3,-1,1,3,5;A(:,2,4)=A=-404-3151.7.2空数组的使用【例2.1.18】寻找数组中的元素
38、L2=A10%接上例,检查A中大于10的元素位置K=find(L2)%找出L2逻辑数组中非零元素的单下标标识isempty(K)%检查K是否为空数组(空矩阵)1.7.2空数组的使用结果依次显示为:L2=0000000000K=ans=1这这里里K=(空空数数组组)代代表表在在数数组组A找找不不到到大大于于10的元素。的元素。1.7.3非数非数NaN(或或nan)按IEEE规定,0/0,/,0等不定运算都会产生非数(NotaNumber)。根据IEEE数学规范NaN具有如下性质:NaN参与运算所得结果也是非数NaN,即具有传递性。NaN没有“大小”概念,即不能比较两个非数的大小。1.7.3非数N
39、aN(或nan)其功能有:真实记述0/0,/,0等不定运算的结果避免可能因0/0,/,0等不定运算而造成的程序执行的中断在绘图时,用于图形的裁剪。1.7.3非数NaN(或nan)【例2.1.18】非数的产生和性质演示。a=0/0,b=0*log(0),c=inf-infWarning:Dividebyzero.a=NaNWarning:Logofzero.b=NaNc=NaN1.7.3非数NaN(或nan)0*a,sin(a)ans=NaNans=NaN1.7.3非数NaN(或nan)class(a)%判断a的类型isnan(a)%判断是否为非数(结果依次为)ans=doubleans=11.
40、7.3非数NaN(或nan)rand(state,0)R=rand(2,5);R(1,5)=NaN;R(2,3)=NaNR=0.95010.60680.89130.4565NaN0.23110.4860NaN0.01850.4447isnan(R)%判断是否为非数ans=0000100100Linear_index=find(isnan(R)%给出R中非数的单下标Linear_index=69r_index,c_index=ind2sub(size(R),Linear_index);%根据单下标求出全下标的行与列下标 disp(r_indexc_index),disp(r_indexc_ind
41、ex)r_indexc_index2315该结果表明该结果表明R的元素的元素R(2,3)和和R(1,5)为非数。为非数。1.7.3非数NaN(或nan)1.7.3非数NaN(或nan)2 2 字符串数组字符串数组 在MATLAB中,字符串是指由字符组成的数组,每一字符占两个字节(16bits)。MATLAB将每一个字母在其内部解释成一个数值。除非要使用此数值,一般情况下只需使用字符。本节要讨论的内容为:如何创建字符数组和如何将字符转换成数值等。2.1字符数组的创建字符数组的创建【例2.2.1】简单字符串的创建a=acharacterarraya=acharacterarraysize(a)an
42、s=117class(a)ans=charischar(a)ans=1【例2.2.2】字符串的合并a=acharacterarray;%注意字符串首的空格。b=thisis;c=strcat(b,a,.)c=thisisacharacterarray.size(c)ans=126whosNameSizeBytesClassa1x1836chararrayans1x216doublearrayb1x714chararrayc1x2652chararrayGrandtotalis53elementsusing118bytes2.2二维字符数组的创建二维字符数组的创建【例2.2.3】二维字符串的创建
43、方法一:中括号直接赋值法S=ThischaracterarrayistwodimensionalS=Thischaracterarrayistwodimensionalsize(S)ans=120方法二:利用串操作函数char,它不需要各字符串数目相同。S1=char(Thischaracterarray,istwodimensional)S1=Thischaracterarrayistwodimensionalsize(S1)ans=220方法三:利用串操作函数strvcat,它也不需要各字符串数目相同。strvcat(Thischaracterarray,istwodimensional)
44、ans=Thischaracterarrayistwodimensional【例2.2.4】中文字符串的创建示例ch1=中文字符串的创建示例中文字符串的创建示例%注意:这里的单引号为英文状态下的。ch1=中文字符串的创建示例size(ch1)ans=110ch2=中文字符串组中文字符串组;第第二二行行%注意比较下列各ch2的形式ch2=中文字符串组第二行size(ch2)ans=26ch2=中文字符串组中文字符串组;第二行第二行ch2=中文字符串组第二行ch2=中文字符串组中文字符串组;第二行第二行ch2=中文字符串组第二行每个中文字符相当于一个每个中文字符相当于一个英文字符,占一个元素位英文
45、字符,占一个元素位置(置(16 16 bitsbits)。)。ch3=char(中文字符串组中文字符串组,第二行第二行)ch3=中文字符串组第二行size(ch3)ans=26【例2.2.5】英、中文单引号的使用ch4=Hesays:Hello!;ch4=Hesays:Hello!ch5=他说:他说:你好!你好!ch5=他说:你好!2.3字符串数组元素的寻址与调用字符串数组元素的寻址与调用【例2.2.6】字符串的寻址与调用示例c1=thisisacharacterarray.;c2=这是一个中文字符串这是一个中文字符串;s1=c1(11:19)s1=characters2=c2(5:end)s
46、2=中文字符串s3=char(s1,s2)%生成二维中英文混合字符数组s3=character中文字符串size(s3)ans=29%全下标寻访二维数组s3(2,3:5)ans=字符串%单下标寻访二维数组s3(1:11)ans=c中h文a字r符a串c2.4字符与数值的相互转换及其转字符与数值的相互转换及其转换函数换函数MATLAB的字符串存储是利用ASCII码来实现的。指令abs和double都可以用来获取字符串的ASCII码值,char则功能相反。中文字符的ASCII码值大于256。常用转换函数int2str,num2str,mat2str常用转换函数int2str把整数数组转换成串数组(非
47、整把整数数组转换成串数组(非整数将被四舍五入调整后再转换)数将被四舍五入调整后再转换)num2str把非整数数组转换为串数组把非整数数组转换为串数组(常用于图形中,数据点的标识)(常用于图形中,数据点的标识)mat2str把数值数组转换成输入形态的串把数值数组转换成输入形态的串数组(常与数组(常与eval指令配用)指令配用)【例2.2.7】字符串与数值转换的示例aaa=abcdefghijklmnopqrstuvwxyz;size(aaa)ans=126ac=double(aaa)ac=Columns1through7979899100101102103Columns8through14104
48、105106107108109110Columns15through21111112113114115116117Columns22through26118119120121122AC=double(upper(aaa)AC=Columns1through765666768697071Columns8through1472737475767778Columns15through2179808182838485Columns22through268687888990ac-AC%ans=Columns1through732323232323232Columns8through14323232323
49、23232Columns15through2132323232323232Columns22through263232323232char(ac-32)ans=ABCDEFGHIJKLMNOPQRSTUVWXYZbbb=字符串与数值转换的示例字符串与数值转换的示例bbb=字符串与数值转换的示例chac=double(bbb)chac=Columns1through455254470994625454251Columns5through851965549655521048059Columns9through11465325190249405char(fliplr(chac)%反转字符串反转字符串ans=例示的换转值数与串符字%等价形式等价形式bbb(end:-1:1)2.5字符串操作函数字符串操作函数