第3章 CHAPTER 3 MATLAB字符串和数组 本章要点:  字符串;  多维数组;  结构数组;  元胞数组。 在MATLAB语言中,数组是存储和运算的基本单元,向量和矩阵是数组的特例。MATLAB常用数组包括一维数组、二维数组、多维数组、结构数组和元胞数组。其中字符串就是一个典型的一维字符数组。二维数组与二维矩阵在形式上是一样的,在第2章已经详细介绍过。本章主要介绍字符串的创建方法、操作和转换常用函数,以及多维数组、结构数组和元胞数组的创建和使用方法。 3.1字符串 在MATLAB语言中,字符串是MATLAB语言的一个重要组成部分,MATLAB语言提供强大的字符串处理功能,本节主要介绍字符串的创建方法、操作和转换常用函数等内容。 3.1.1字符串的创建 在MATLAB语言中,字符串一般以ASCII码形式存储,以行向量形式存在,并且每个字符占用两字节的内存。在MATLAB语言中,创建一个字符串可以用下面几种方法。 (1) 直接将字符内容用单引号(' ')括起来,例如: >>str='Teacher_name' str = 'Teacher_name' 字符串的存储空间如下所示,所定义的字符串有12个字符,每个字符占用两字节的内存。 >>whos NameSizeBytesClassAttributes str1x1224char 若要显示单引号(')字符,需要使用两个单引号,例如: >>str='I''m a teacher' str = 'I'm a teacher' (2) 用方括号连接多个字符串组成一个长字符串,例如: >>str=['I''m' ' a' ' teacher'] str = 'I'm a teacher' (3) 用函数strcat把多个字符串水平连接合并成一个长字符串,strcat函数语法格式如下: str=strcat(str1,str2,…) 例如: >> str1='I''m a student'; >> str2= ' of'; >> str3=' Guangdong Ocean University'; >>str=strcat(str1,str2,str3) str = 'I'm a student of Guangdong Ocean University' (4) 用函数strvcat把多个字符串连接成多行字符串,strvcat函数语法格式如下: str=strvcat(str1,str2,…) 例如: >> str1='good'; >> str2='very good'; >> str3='very very good'; >> strvcat(str1,str2,str3) ans = 3×14 char 数组 'good' 'very good' 'very very good' MATLAB语言可以用abs或者double函数获取字符串所对应的ASCII码数值矩阵。相反,可以用char函数把ASCII码转换为字符串。例如: >> str1='I''m a teacher' str1 = 'I'm a teacher' >> A=abs(str1) %把字符串转换为对应的ASCII码数值矩阵 A = 73391093297321161019799104101114 >>str=char(A) %把ASCII码数值矩阵转换为字符串 str = 'I'm a teacher' 【例31】已知一个字符串向量str='It is a Yellow Dog',完成以下任务: 微课视频 (1) 计算字符串向量字符个数; (2) 显示'a Yellow Dog'; (3) 将字符串倒序重排; (4) 将字符串中的大写字母变成相应小写字母,其余字符不变。 将下列程序代码存为脚本文件fexam_3_1.m,并放于当前工作目录下。 str='It is a Yellow Dog'%创建字符串向量 n=length(str)%计算字符串向量字符个数 str1=str(7:18)%显示'a Yellow Dog' str2=str(end:-1:1)%将字符串倒序重排 k=find(str>='A'&str<='Z') %查找大写字母的位置 str(k)=str(k)+('a'-'A')%将大写字符变成相应小写字母 然后在命令行窗口中运行下列指令: >> fexam_3_1 str = 'It is a Yellow Dog' n = 18 str1 = 'a Yellow Dog' str2 = 'goD wolleY a si tI' k = 1916 str = 'it is a yellow dog' 3.1.2字符串的操作 1. 字符串比较 MATLAB语言比较两个字符串是否相同的常用函数有strcmp、strncmp、strcmpi和strncmpi这4个,字符串比较函数的调用格式及功能说明如表31所示。 表31字符串比较函数格式及功能 函数名调 用 格 式功 能 说 明 strcmpstrcmp(str1,str2)比较两个字符串是否相等,相等为1,不相等为0 strncmpstrncmp(str1,str2,n)比较两个字符串前n个字符是否相等,相等为1,不相等为0 strcmpistrcmpi(str1,str2)忽略大小写,比较两个字符串是否相等,相等为1,不相等为0 strncmpistrncmpi(str1,str2,n)忽略大小写,比较两个字符串前n个字符是否相等,相等为1,不相等为0 例如: >> str1={'one','two','three','four'};%定义字符串元胞数组 >> str2='two'; >> strcmp(str1,str2)%比较两个字符串str1和str2是否相等 ans = 1×4 logical 数组 0100 >> str1='I am a handsome boy'; >> str2='I am a pretty girl'; >> strncmp(str1,str2,7)%比较两个字符串str1和str2前7个字符是否相等 ans = logical 1 >> strncmp(str1,str2,8) ans = logical 0 >> str1='MATLAB 2018a'; >> str2='MATLAB 2018A'; >> strcmp(str1,str2) ans = logical 0 >> strcmpi(str1,str2)%忽略大小写,比较两个字符串是否相等 ans = logical 1 >> str1='I am a handsome boy'; >> str2='I am A pretty girl'; >> strncmpi(str1,str2,7)%忽略大小写,比较两个字符串前7个字符是否相等 ans = logical 1 >> strncmp(str1,str2,7) ans = logical 0 2. 字符串查找和替换 MATLAB语言查找与替换字符串的常用函数有5个: strfind、findstr、strmatch、strtok和strrep。字符串查找函数的调用格式及功能说明如表32所示。 表32字符串查找函数 函数名功 能 说 明 strfind(str, 'str1')在字符串str中查找另一个字符串str1出现的位置 findstr(str, 'str1')在一个较长 字符串str中查找较短字符串str1出现的位置 strmatch('str1',str)在str字符串数组中,查找匹配以字符str1为开头的字符串所在的行数 strtok(str)从字符串str中截取第一个分隔符(包括空格、Tab键和回车键)前面的字符串 strrep(str, 'oldstr', 'newstr')在原来字符串str中,用新的字符串newstr替换旧的字符串oldstr 例如: >>str='sqrt(X) is the square root of the elements of X. Complex'%构建一个长字符串str str = 'sqrt(X) is the square root of the elements of X. Complex' >>findstr(str,'of')%在一个较长字符串str中查找较短字符串'of'出现的位置 ans = 2844 >>strfind(str,'of')%在字符串str中查找字符串'of'出现的位置 ans = 2844 >>strrep(str,'X','Y')%在原来字符串str中,用新的字符串'Y'替换旧的字符串'X' ans = 'sqrt(Y) is the square root of the elements of Y. Complex' >>strtok(str)%从字符串str中截取第一个分隔符前面的字符串sqrt(X) ans = 'sqrt(X)' >>str=strvcat('good','very good','very very good')%构建字符串数组str str = 3×14 char 数组 'good' 'very good' 'very very good' >>strmatch('very',str)%在字符串数组str中,查找匹配以字符'very'为开头的字符串 %所在的行数 ans = 2 3 3. 字符串的其他操作 在MATLAB语言中,除了常用的字符串创建、比较、查找和替换操作外,还有许多其他字符串操作,如表33所示。 表33字符串其他操作函数 函数名函数功能及说明 upper(str)将字符串str中的字符转换为大写 lower(str)将字符串str中的字符转换为小写 strjust(str,'right') strjust(str)将字符串str右对齐 strjust(str,'left')将字符串str左对齐 strjust(str,'center')将字符串str中间对齐 strtrim(str)删除字符串开头和结束的空格符 eval(str)执行字符常量str运算 例如: >>str='Matlab 2020a' str = 'Matlab 2020a' >> upper(str)%将字符转换为大写 ans = 'MATLAB 2020A' >> lower(str)%将字符转换为小写 ans = 'matlab 2020a' >>str=strvcat('good','very good','very very good')%创建一个字符串str序列 str = 3×14 char 数组 'good' 'very good' 'very very good' >>strjust(str)%将字符串str右对齐 ans = 3×14 char 数组 'good' 'very good' 'very very good' >>strjust(str,'right')%将字符串str右对齐 ans = 3×14 char 数组 'good' 'very good' 'very very good' >>strjust(str,'left')%将字符串str左对齐 ans = 3×14 char 数组 'good' 'very good' 'very very good' >>strjust(str,'center')%将字符串str中间对齐 ans = 3×14 char 数组 'good' 'very good' 'very very good' >>str='matlab 2020a' str = 'matlab 2020a' >>strtrim(str)%删除字符串开头和结束的空格符 ans = 'matlab 2020a' >>str='2*3+6'%创建一个字符串常量 str = '2*3+6' >>eval(str)%执行字符常量str运算 ans = 12 3.1.3字符串转换 在MATLAB语言中,字符串进行算术运算会自动转换为数值型。MATLAB还提供了许多字符串与数值之间转换函数,如表34所示。 表34字符串与数值转换函数 函数名格式及例子功能与说明 absabs('a')=97将字符串转换为ASCII码数值 doubledouble('a')=97将字符串转换为ASCII码数值的双精度类型数据 charchar(97)=a将数值整数部分转换为ASCII码等值的字符 str2numstr2num('23')=23将字符串转换为数值 num2strnum2str(63)= '63'将数值转换为字符串 str2doublestr2double('97')=97将字符串转换为双精度类型数据 mat2strmat2str([32,64;97,101])= ' [32 64;97 101] '将矩阵转换为字符串 dec2hexdec2hex(64)= '40'将十进制整数转换为十六进制整数字符串 hex2dechex2dec ('40')=64将十六进制字符串转换为十进制整数 dec2bindec2bin(16)= '10000'将十进制整数转换为二进制整数字符串 bin2decbin2dec('10000')=16将二进制字符串转换为十进制整数 dec2basedec2base(16,8)= '20'将十进制整数转换为指定进制整数字符串 base2decbase2dec('20',8)=16将指定进制字符串转换为十进制整数 例如,可以利用字符串与数值之间的转换,对一串字符明文进行加密处理。MATLAB代码如下: >>str='welcome to MATLAB 2020a'%创建待加密的字符串 str = 'welcome to MATLAB 2020a' >> str1=str-2;%将每个字符的ASCII码值减去2 >> str2=char(str1)%将移位后的每个ASCII码转换为字符,完成加密 str2 = 'ucjamkc-rm-K?RJ?@-0.0.' >> str3=str2+2;%解密与加密相反的过程 >> str4=char(str3) str4 = 'welcome to MATLAB 2020a' 3.2多维数组 多维数组(Multidimensional Arrays)是三维及以上的数组。三维数组是二维数组的扩展,二维数组可以看成行和列构成的面,三维数组可以看成行、列和页构成的“长方体”,实际中三维数组用得比较多。 三维数组用3个下标表示,数组的元素存放遵循的规则是: 首先存放第一页第一列,接着是该页的第二列、第三列,以此类推; 第一页最后一列接第二页第一列,直到最后一页最后一列结束。 四维数组和三维数组有些类似,使用4个下标表示,更高维的数组是在后面添加维度来确定页。 3.2.1多维数组的创建 多维数组的创建一般有4种方法: 直接赋值法、二维数组扩展法、使用cat函数创建法和使用特殊数组函数法。 1. 直接赋值法 例如,创建三维数组A。 >> A(:,:,1)=[1 2;3 4]%赋值第一页 A = 12 34 >> A(:,:,2)=[5 6;7 8]%赋值第二页 A(:,:,1) = 12 34 A(:,:,2) = 56 78 >>whos A%查看三维数组A的属性 NameSizeBytesClassAttributes A2x2x264double 2. 二维数组扩展法 MATLAB可以利用二维数组扩展到三维数组,例如: >> B=[1 2;3 4] B = 12 34 >>B(:,:,2)=[5 6;7 8] B(:,:,1) = 12 34 B(:,:,2) = 56 78 如果第一页不赋值,直接赋值第二页,那么也能产生三维数组,第一页值全默认为0,例如: >>C(:,:,2)=[5 6;7 8] C(:,:,1) = 00 00 C(:,:,2) = 56 78 3. 使用cat函数创建法 MATLAB语言可以使用cat函数,把几个原先赋值好的数组按照某一维连接起来,创建一个多维数组。函数调用格式如下: A=cat(n,A1,A2,…)%将A1、A2等数组连接成n维数组 例如,使用cat函数创建多维数组: >> A1=[1 2;3 4];%创建三个二维数组 >> A2=[5 6;7 8]; >> A3=[9 10;11 12]; >> A=cat(1,A1,A2,A3)%用函数cat按垂直方向连接A1、A2和A3成一个二维数组 A = 12 34 56 78 910 1112 >> A=cat(2,A1,A2,A3)%用函数cat按水平方向连接A1、A2和A3成一个二维数组 A = 1256910 34781112 >> A=cat(3,A1,A2,A3)%用函数cat创建一个三维数组 A(:,:,1) = 12 34 A(:,:,2) = 56 78 A(:,:,3) = 910 1112 4. 使用特殊数组函数法 MATLAB语言提供了许多创建特殊多维矩阵的函数,例如,rand、randn、ones和zeros等,这些函数都可以创建多维特殊矩阵。函数的功能和使用方法与二维特殊矩阵类似。 例如: >> A=rand(2,2,2)%创建0~1均匀分布的三维随机矩阵 A(:,:,1) = 0.09750.5469 0.27850.9575 A(:,:,2) = 0.96490.9706 0.15760.9572 >> B=randn(2,2,2)%创建正态分布的三维随机矩阵 B(:,:,1) = -0.0631-0.2050 0.7147-0.1241 B(:,:,2) = 1.48971.4172 1.40900.6715 >> C=ones(2,2,2)%创建三维1矩阵 C(:,:,1) = 11 11 C(:,:,2) = 11 11 >> D=zeros(2,2,2)%创建三维0矩阵 D(:,:,1) = 00 00 D(:,:,2) = 00 00 >> E=rand(2,2,2,2)%创建0~1均匀分布的四维随机矩阵 E(:,:,1,1) = 0.03570.9340 0.84910.6787 E(:,:,2,1) = 0.75770.3922 0.74310.6555 E(:,:,1,2) = 0.17120.0318 0.70600.2769 E(:,:,2,2) = 0.04620.8235 0.09710.6948 3.2.2多维数组的操作 MATLAB多维数组操作主要有数组元素的提取、多维数组形状的重排和维度重新排序。 1. 多维数组元素的提取 提取多维数组元素的方法有两种: 全下标方式和单下标方式。 1) 全下标法 例如: >> A=[1 2;3 4]; >> A(:,:,2)=[5 6;7 8]%创建一个三维数组 A(:,:,1) = 12 34 A(:,:,2) = 56 78 >> a=A(1,1,2)%用全下标法提取第2页第1行第1列的元素 a = 5 2) 单下标法 MATLAB单下标法提取多维数组的元素遵循的规则: 先是第一页第一列,然后是第一页第二列,以此类推; 直到第一页最后一列,然后是第二页第一列,直到最后一页最后一列。 例如: >> A=[1 2;3 4]; >> A(:,:,2)=[5 6;7 8]%创建一个三维数组 A(:,:,1) = 12 34 A(:,:,2) = 56 78 >> a=A(7)%单下标法提取第7个元素 a = 6 2. 多维数组形状的重排 MATLAB语言可以利用函数reshape改变多维数组的形状,函数的调用格式如下: A=reshape(A1,[m,n,p]) 其中m、n和p分别表示行、列和页,A1是重排的多维数组。数组还是按照单下标方式存储顺序重排,重排前后元素数据大小没变,位置和形状会改变。 例如: >> A1=rand(3,3);%创建三维数组 >>A1(:,:,2)=randn(3,3) A1(:,:,1) = 0.44560.75470.6551 0.64630.27600.1626 0.70940.67970.1190 A1(:,:,2) = -0.00680.3714-1.0891 1.5326-0.22560.0326 -0.76971.11740.5525 >> A=reshape(A1,[2,3,3])%重排 第2行、第3列和第3页的三维数组 A(:,:,1) = 0.44560.70940.2760 0.64630.75470.6797 A(:,:,2) = 0.65510.11901.5326 0.1626-0.0068-0.7697 A(:,:,3) = 0.37141.11740.0326 -0.2256-1.08910.5525 3. 多维数组维度的重新排序 MATLAB语言可以利用函数permute重新定义多维数组的维度顺序,按照新的行、列和页重新排序数组,permute改变了线性存储的方式,函数的调用格式如下: A=permute(A1,[m,n,p]) 其中m、n和p分别是列、行和页,A1是重定义的多维数组,要求定义后的维度不少于原数组的维度,而且各维度数不能相同。 例如: >> A1=rand(3,3);%创建一个三维数组 >> A1(:,:,2)=randn(3,3) A1(:,:,1) = 0.89090.13860.8407 0.95930.14930.2543 0.54720.25750.8143 A1(:,:,2) = -0.1924-1.4023-0.1774 0.8886-1.4224-0.1961 -0.76480.48821.4193 >> B=permute(A1,[3,2,1])%重新定义三维数组,存储顺序改变 B(:,:,1) = 0.89090.13860.8407 -0.1924-1.4023-0.1774 B(:,:,2) = 0.95930.14930.2543 0.8886-1.4224-0.1961 B(:,:,3) = 0.54720.25750.8143 -0.76480.48821.4193 彩色图像被读入MATLAB中,RGB三种颜色分量一般被存为三维数组。对彩色图像进行处理,实际上是对三维数组进行提取和操作,所以用MATLAB语言处理彩色图像比较方便。下面通过一个例子说明三维数组在彩色图像处理中的应用。 微课视频 【例32】用MATLAB语言对一幅彩色图像分别提取红色分量、绿色分量和蓝色分量,并在同一个图形窗口不同区域显示,利用cat函数把三个分量连接成一个三维数组,并显示合成后的图像。 程序代码如下: clear close all; %------读入图片flower.jpg存入A中------% A=imread('D:\work\flower.jpg'); subplot(2,2,1) imshow(A);%将三维数组A显示为彩色图像 title('原始图像') [r c d]=size(A);%计算图像大小,r为行,c为列,d为页,1、2和3分别代表红、绿和蓝分量 %------提取红色分量并显示分解图------% red(:,:,1)=A(:,:,1); red(:,:,2)=zeros(r,c); %蓝色和绿色分量用0矩阵填充 red(:,:,3)=zeros(r,c); red=uint8(red); subplot(2,2,2) imshow(red) title('红色分量'); %-------提取绿色分量并显示分解图-------% green(:,:,2)=A(:,:,2); green(:,:,1)=zeros(r,c); green(:,:,3)=zeros(r,c); green=uint8(green); subplot(2,2,3) imshow(green) title('绿色分量'); %--------提取蓝色分量并显示分解图-------% blue(:,:,3)=A(:,:,3); blue(:,:,1)=zeros(r,c); blue(:,:,2)=zeros(r,c); blue=uint8(blue); subplot(2,2,4) imshow(blue) title('蓝色分量'); %------------合成彩色图像-----------% ci=cat(3,red(:,:,1),green(:,:,2),blue(:,:,3)); figure; subplot(1,2,1) imshow(A); title('原始图像') subplot(1,2,2) imshow(ci); title('合成图像'); 由程序代码可知,彩色图像读入MATLAB中,被存为三维数组,红色分量存为第一页,绿色分量存为第二页,蓝色分量存为第三页。用三维数组提取和连接方法就能实现三种颜色分量的提取以及合成彩色图像,程序结果如图31和图32所示。 图31提取彩色图像各个分量 图32原始图像和合成图像比较 3.3结构数组 在MATLAB语言中,有两种复杂的数据类型,分别是结构数组(Structure Array)和元胞数组(Cell Array),这两种类型都能在一个数组里存放不同类型的数据。 结构数组又称结构体,能将一组具有不同属性的数据放到同一个变量名下进行管理。结构体的基本组成是结构,每个结构可以有多个字段,可以存放多种不同类型的数据。 3.3.1结构数组的创建 结构数组的创建方法有两种: 直接创建和用struct函数创建。 (1) 直接创建。可以直接使用赋值语句,对结构数组的元素赋值不同类型的数据。具体格式: 结构数组名.成员名=表达式 例如,构建一个班级学生信息结构数组dz1143,有三个元素dz1143(1)、 dz1143(2)和dz1143(3),每个元素有四个字段Name、Sex、Nationality和Score,分别存放学生姓名、性别、国籍和成绩等信息。 程序代码如下: >> dz1143(1).Name='Zhang san'; >> dz1143(1).Sex='Male'; >> dz1143(1).Nationality='China'; >> dz1143(1).Score=[98 95 90 99 87]; >> dz1143(2).Name='Li si'; >> dz1143(2).Sex='Male'; >> dz1143(2).Nationality='Japan'; >> dz1143(2).Score=[88 95 91 90 97]; >> dz1143(3).Name='Wang wu'; >> dz1143(3).Sex='Female'; >> dz1143(3).Nationality='USA'; >> dz1143(3).Score=[81 75 61 80 87]; >> dz1143 dz1143 = 包含以下字段的 1×3 struct数组: Name Sex Nationality Score 其中,dz1143是结构数组名,dz1143(1)、dz1143(2)和dz1143(3)分别是结构数组的元素,Name、Sex、Nationality和Score分别是字段。 (2) 利用struct函数创建结构数组。函数具体格式如下: struct('field1','值1', 'field2','值2', 'field3','值3',...) 例如: >>dz1144(1)=struct('Name','Like','Sex','Male','Nationality','China','Score',[98,95,91,89]) dz1144 = 包含以下字段的struct: Name: 'Li ke' Sex: 'Male' Nationality: 'China' Score: [98 95 91 89] >>dz1144(2)=struct('Name','Xubo','Sex','Male','Nationality','Canada','Score',[99,97,95,92]) dz1144 = 包含以下字段的 1×2 struct数组: Name Sex Nationality Score 3.3.2结构体内部数据的获取 (1) 使用“.”符号获取结构体内部数据,对于3.3.1节例题中的dz1143结构体,用下面命令获得结构体的各个字段的内部数据: >> str1=dz1143(1).Name str1 = 'Zhang san' >> str2=dz1143(1).Sex str2 = 'Male' >> str3=dz1143(1).Nationality str3 = 'China' >> S=dz1143(1).Score S = 9895909987 (2) 使用函数getfield获取结构体内部数据,函数的格式如下: str=getfield(S,{S_index},'fieldname',{field_index}) 其中,S是结构体名称,S_index是结构体的元素,fieldname是结构体的字段,field_index是字段中数组元素的下标。 例如: >> str1=getfield(dz1143,{1},'Name') %获取dz1143结构体中第一个元素, %字段为Name的内容 str1 = 'Zhang san' >> S1=getfield(dz1143,{1},'Score',{2}) %获取dz1143结构体中第一个 %元素,字段Score中第2门课成绩 S1 = 95 (3) 使用函数fieldnames获取结构体所有字段,函数的格式如下: x=fieldnames(S) 例如: >> x=fieldnames(dz1143)%获取结构体dz1143所有字段信息 x = 4×1 cell 数组 {'Name'} {'Sex'} {'Nationality'} {'Score'} >> whos dz1143 x%查看结构体dz1143和变量x的属性信息 NameSizeBytesClassAttributes dz11431x31720struct x4x1462cell 3.3.3结构体的操作函数 (1) 可以使用函数setfield对结构体的数据进行修改,函数的格式如下: S=setfiled(S,{S_index},'fieldname',{field_index},值) 例如,修改结构体dz1143(1)中的Sex字段的内容: >> dz1143=setfield(dz1143,{1},'Sex','Female')%修改字段Sex内容 dz1143 = 包含以下字段的 1×3 struct数组: Name Sex Nationality Score (2) 可以使用rmfield函数删除结构体的字段,函数格式如下: S=rmfield(S,'fieldname') 例如,删除结构体dz1143中的Nationality字段。 >> dz1143=rmfield(dz1143,'Nationality')%删除字段Nationality dz1143 = 包含以下字段的 1×3 struct数组: Name Sex Score 3.4元胞数组 元胞数组是常规矩阵的扩展,其基本元素是元胞,每个元胞可以存放各种不同类型的数据,如数值矩阵、字符串、元胞数组和结构数组等。 3.4.1元胞数组的创建 创建元胞数组的方法和一般数值矩阵方法相似,用大括号将所有元胞括起来。创建元胞数组方法有两种: 直接创建和使用函数创建。 (1) 直接创建元胞数组。可以一次性输入所有元胞值,也可以每次赋值一个元胞值。 >> A={[1+2i],'MATLAB 2020A';1:6,{[1 2;3 4],'cell'}}%一次性输入所有元胞值 A = 2×2 cell 数组 {[1.0000 + 2.0000i]}{'MATLAB 2020A'} {1×6 double}{1×2 cell} >> B(1,1)={[1+2i]};%每次输入一个元胞值 >> B(1,2)={'MATLAB 2020A'}; >> B(2,1)={1:6}; >> B(2,2)={{[1 2;3 4],'cell'}} B = 2×2 cell 数组 {[1.0000 + 2.0000i]}{'MATLAB 2020A'} {1×6 double}{1×2 cell} 另外,还可以根据各元胞内容创建元胞数组,例如: >> C{1,1}=[1+2i]; >> C{1,2}='MATLAB 2020A'; >> C{2,1}=1:6; >> C{2,2}={[1 2;3 4],'cell'} C = 2×2 cell 数组 {[1.0000 + 2.0000i]}{'MATLAB 2020A'} {1×6 double}{1×2 cell} 由上面结果可知,用三种不同的直接输入法创建的元胞数组A、B和C结果是一样的。注意()和{ }的区别,创建元胞数组无论用哪种方法,等式的左边或者右边一般都需要使用一次{ },除了元胞,因它是由元胞数组构成的,需要用两次{ }。 (2) MATLAB语言可以使用cell函数创建元胞数组。函数格式如下: A=cell(m,n) cell函数可以创建一个m×n空的元胞数组,对于每个元胞的数据还需要单独赋值。例如: >> A=cell(2) A = 2×2 cell 数组 {0×0 double}{0×0 double} {0×0 double}{0×0 double} >> A{1,1}=[1+2i]; >> A{1,2}='MATLAB 2020A'; >> A{2,1}=1:6; >> A{2,2}={[1 2;3 4],'cell'} A = 2×2 cell 数组 {[1.0000 + 2.0000i]}{'MATLAB 2020A'} {1×6 double}{1×2 cell} 3.4.2元胞数组的操作 在MATLAB中,创建元胞数组后,可以通过下面几种方法,引用和提取元胞数组元素数据。 (1) 用{ }提取元胞数组的元素数据。 例如: >> A={1+2i,'MATLAB 2020A';1:6,{[1 2;3 4],'cell'}}%创建2×2的元胞数组 A = 2×2 cell 数组 {[1.0000 + 2.0000i]}{'MATLAB 2020A'} {1×6 double}{1×2 cell} >> a=A{2,1}%全下标提取元素 a = 123456 >> a=A{1,2} a = 'MATLAB 2020A' >> a=A{4}%单下标提取元素 a = 1×2 cell 数组 {2×2 double}{'cell'} (2) 使用()只能定位元胞的位置,返回的仍然是元胞类型的数组,不能得到详细元胞元素数据,例如: >> b=A(2,1)%全下标定位 b = 1×1 cell 数组 {1×6 double} >> b=A(4)%半下标定位 b = 1×1 cell 数组 {1×2 cell}%元胞类型 (3) 用deal函数提取多个元胞元素的数据。 例如: >> [c1,c2,c3]=deal(A{[1:3]})%提取元胞数组A中第一到第三个元素 %分别赋值给c1、c2和c3 c1 = 1.0000 + 2.0000i c2 = 123456 c3 = 'MATLAB 2020A' >> [c1,c2,c3,c4]=deal(A{:,:}) c1 = 1.0000 + 2.0000i c2 = 123456 c3 = 'MATLAB 2020A' c4 = 1×2 cell 数组 {2×2 double}{'cell'} (4) 用celldisp函数显示元胞数组中详细数据内容。 在MATLAB命令窗口中,输入元胞数组名称,只显示元胞数组的各元素的数据类型和尺寸,不直接显示各元素的详细内容。可以用celldisp函数显示元胞数组中各元素的详细数据内容。 例如: >> A={1+2i,'MATLAB 2020A';1:6,{[1 2;3 4],'cell'}}%创建2×2的元胞数组 A = 2×2 cell 数组 {[1.0000 + 2.0000i]}{'MATLAB 2020A'} {1×6 double}{1×2 cell} >> A%在命令窗口直接输入元胞数组名称 A =%只显示各元胞的数据类型和尺寸 2×2 cell 数组 {[1.0000 + 2.0000i]}{'MATLAB 2020A'} {1×6 double}{1×2 cell} >> celldisp(A)%显示元胞数组各元胞的具体数据 A{1,1} = 1.0000 + 2.0000i A{2,1} = 123456 A{1,2} = MATLAB 2020A A{2,2}{1} = 12 34 A{2,2}{2} = cell (5) 用cellplot函数以图形方式显示元胞数组的结构。 在MATLAB中,可以用cellplot函数以图形方式显示元胞数组的结构。 例如,创建一个元胞数组,并用图形方式显示。 代码如下: >> A={1+2i,'MATLAB 2020A';1:6,{[1 2;3 4],'cell'}}%创建2×2的元胞数组 A = 2×2 cell 数组 {[1.0000 + 2.0000i]}{'MATLAB 2020A'} {1×6 double}{1×2 cell} >> cellplot(A) 用cellplot函数显示元胞数组A,结果如图33所示。用不同的颜色和形状表示元胞数组各元素的内容。 图33元胞数组显示图 习题 1. 定义两个字符串str1='MATLABR2018a'和str2='MATLABR2018A',试用字符串比较函数strcmp、strncmp、strcmpi和strncmpi比较str1和str2两个字符串。 2. 在MATLAB语言中,建立下面的多维数组。 A(:,:,1) = 000 000 000 A(:,:,2) = 111 111 111 A(:,:,3) = 100 010 001 3. 在MATLAB语言中,建立下面的结构数组。 dz1161 = Name: 'Li ke' Sex: 'Male' Province: 'Guangdong' Tel: '13800000000' >>whos dz1161 NameSizeBytesClassAttributes dz11611x1762struct