三、字符串
在 MATLAB 中,有两种基本的数据类型,一个是数值型数据,一个是字符型数据或称字符串数据。
数值型数据比较好理解,是指能参与数值运算的数据,又分为整型、浮点型和复数型。
字符型数据在日常应用中则不太强调,但却是大量存在的,例如统计一篇英文文章中不同英文字母出现的次数,按姓名排序,等等。字符串数据由若干个字符组成,这些字符可以是计算机系统中允许使用的任何字符。
1. 字符串的表示
- 在 MATLAB 中,字符串是单引号括起来的字符序列。
>> x='yan zi 22' x = 'yan zi 22'
若字符串中的字符含有单引号,则该单引号字符要用两个单引号来表示。
>> 'I ''m a student.' ans = 'I 'm a student.'
MATLAB 将一个字符串当作一个行向量,每个元素对应一个字符,其引用方法和数值向量相同。
>> A='ABCDEF'; >> A(1:3) ans = 'ABC'
也可以建立多行字符串,形成字符串矩阵。
>> A=['abcdef';'123456']; >> A(2,3) ans = '3'
需要注意的是,这里要求各行字符数要相等。为此,有时不得不用空格来调节各行的长度,使它们彼此相等。
例如,我们建立一个字符串向量,然后对该向量做如下处理。
(1) 取第 1~5 个字符组成的子字符串。
(2) 将字符串倒过来重新排列。
(3) 将字符串中的小写字母变成相应的大写字母,其余字符不变。
(4) 统计字符串中小写字母的个数。
>> A='ABc123d4e56Fg9'; >> A1=A(1:5) A1 = 'ABc12' >> A2=A(end:-1:1) A2 = '9gF65e4d321cBA' >> k=find(A>='a'&A<='z'); >> A(k)=A(k)-('a'-'A') A = 'ABC123D4E56FG9' >> length(k) ans = 4
2. 字符串的操作
2.1 字符串的执行
- 与字符串有关的一个重要函数是
eval
,它的作用是把字符串的内容作为对应的 MATLAB 命令来执行,其调用格式如下:
>> eval(s)
其中,s 是字符串。
>> t=pi; >> m='[t,sin(t),cos(t)]'; >> y=eval(m) y = 3.1416 0.0000 -1.0000
2.2 字符串与数值之间的转换
- 字符串是以 ASCII 码形式存储的,
abs
和double
函数都可以用来获取字符串矩阵所对应的 ASCII 码数值矩阵。char
函数可以把 ASCII 码矩阵转换为字符串矩阵。
>> s1='MATLAB'; >> a=abs(s1) a = 77 65 84 76 65 66 >> b=double(s1) b = 77 65 84 76 65 66 >> char(a+32) ans = 'matlab'
- MATLAB 还有许多用于字符串和数值数据之间转换的函数。
setstr
函数将 ASCII 码值转换成对应的字符。str2num
函数或str2double
函数将数字字符串转换成数值。num2str
函数将数值转换成字符串。int2str
函数将整数转换成字符串。
2.3 字符串的连接
- 在 MATLAB 中,要将两个字符串连接在一起,有两种常见方法:一是用字符串向量,二是用
strcat
函数。 - 用字符串向量可以将若干个字符串连接起来,即用中括号将若干个字符串括起来,从而得到一个更长的字符串。
>> f=70; >> c=(f-32)/1.8; >> ['Room temperature is ',num2str(c),' degree C.'] ans = 'Room temperature is 21.1111 degree C.'
strcat
函数可以将若干个字符串连接起来。
>> strcat('yan','zi','22') ans = 'yanzi22'
2.4 字符串的比较
- 字符串的比较有两种方法,利用关系运算符或字符串比较函数。
- 当两个字符串拥有相同的长度时,可以利用关系运算符对字符串进行比较,比较的规则是按 ASCII 值大小逐个字符进行比较,比较的结果是一一个数值向量,其元素为对应字符比较的结果。
>> 'www0'>='W132' ans = 1×4 logical 数组 1 1 1 0
字符串比较函数用于判断字符串是否相等,有 4 种比较方式,函数如下。
(1) strcmp(s1,s2):用来比较字符串 s1 和 s2 是否相等,如果相等,返回 1, 否则返回 0。
(2) strncmp(s1,s2,n):用来比较前 n 个字符是否相等,如果相等,返回 1,否则返回 0。
(3) strcmpi(s1,s2):在忽略字母大小写前提下,比较字符串 s1 和 s2 是否相等,如果相等,返回 1,否则返回 0。
(4) strnempi(s1,s2,n):在忽略字符串大小写前提下,比较前 n 个字符是否相等,如果相等,返回 1,否则返回 0。
>> strcmp('www0','W123') ans = logical 0 >> strncmpi('ww0','W12',1) ans = logical 1
2.5 字符串的查找与替换
- MATLAB 提供了许多函数,用来对字符串中的字符进行查找与替换。常用的有以下两个。
- (1)
findstr(s1,s2)
:返回短字符串在长字符串中的开始位置(s1,s2 的顺序没有要求)。
>> p1=findstr('this is a test','is') p1 = 3 6 >> p2=findstr('is','this is a test') p2 = 3 6
- 短字符串 is 在长字符串 this is a test 中出现两次,开始位置分别为 3 和 6。
- (2)
strep(1,s2,s3)
:将字符串 s1 中的所有子字符串 s2 替换为字符串 s3。
>> p3=strrep('this is a test','test','success') p3 = 'this is a success'
四、结构数据与单元数据
- MATLAB 新增加了两种数据类型:结构数据类型和单元数据类型。
- 这两种数据类型均是将不同的相关数据集成到一个单-的变量中,使得大量的相关数据的处理
与引用变得简单、方便。
1. 结构数据
- 个人感觉可以参考 C++ 中的结构体。
- 结构数据类型把一组类型不同而逻辑上相关的数据组成一个有机的整体,以便于管理和引用。例如要存储学生的基本信息就可采用结构数据类型。
1.1 结构数据的建立与引用
- 结构矩阵的元素可以是不同的数据类型,它能将一组具有不同属性的数据纳入到一个统一的变量名下进行管理。建立一个结构矩阵可以采用给结构成员赋值的办法,其格式如下:
结构矩阵名.成员名=表达式
其中,表达式应理解为矩阵表达式。例如,我们要建立含有 3 个元素的结构矩阵 a,命令如下:
>> a(1).x1=10;a(1).x2='liu';a(1).x3=[11,21;34,78]; >> a(2).x1=12;a(2).x2='wang';a(2).x3=[34,191;27,578]; >> a(3).x1=14;a(3).x2='cai';a(3).x3=[13,180;57,231];
- 这里需要注意的是,结构矩阵元素的成员也可以是结构数据。
>> a(2).x1.x11=90;a(2).x1.x12=12;a(2).x1.x13=30;
- 以上建立的结构矩阵 a 含有 3 个元素,每个元素又含有 3 个成员,成员 a(2).x1 又是含有 3 个成员的结构数据。
- 对结构数据的引用,可以引用其成员,也可以引用结构矩阵的元素或结构变量。
>> a(2).x3 ans = 34 191 27 578 >> a(2) ans = 包含以下字段的 struct: x1: 12 x2: 'wang' x3: [2×2 double] >> a a = 包含以下字段的 1×3 struct 数组: x1 x2 x3
引用结构矩阵元素的成员时,显示其值。引用结构矩阵元素时,显示成员名和它的值,但成员是矩阵时,不显示其具体内容,只显示成员矩阵大小参数。引用结构矩阵时,只显示结构矩阵的大小参数和成员名。
1.2 结构成员的修改
- 可以根据需要增加或删除结构的成员。例如,我们要给结构矩阵 a 增加一一个成员 x4, 可给 a 中任意一个元素增加成员 x4,命令如下:
>> a(1).x4='410075';
- 但其他成员均为空矩阵,可以使用赋值语句给它赋确定的值。
- 要删除结构的成员,则可以使用
rmfield
函数来完成。例如,要删除成员 x4,命令如下:
>> a=rmfield(a,'x4');
2. 单元数据
- 单元数据类型与结构数据类型类似,也是把不同属性的数据放在一个变量中。不同的是,结构矩阵的各个元素下有成员,每个成员都有自己的名字,对成员的引用如下:
结构矩阵名.成员名
- 而单元矩阵的各个元素就是不同类型的数据,用带有大括号下标的形式引用单元矩阵元素。
- 建立单元矩阵和一般矩阵相似,只是矩阵元素用大括号括起来。
>> a={10,'liu',[11,21;34,78];12,'wang',[34,191;27,578];14,'cai',[13,890;67,231]} a = 3×3 cell 数组 {[10]} {'liu' } {2×2 double} {[12]} {'wang'} {2×2 double} {[14]} {'cai' } {2×2 double}
可以用带有大括号下标的形式引用单元矩阵元素。
>> a{3,3} ans = 13 890 67 231
- 单元矩阵的元素可以是结构或单元数据。例如,我们先建立结构变量 y,给上面建立的单位矩阵 a 的元素 a{3,4} 赋值,命令如下:
>> y.x1=34;y.x2=56; >> a{3,4}=y;
可以使用 celldisp
函数来显示整个单元矩阵,如 celldisp(a)。还可以删除单元矩阵中某个元素,如删除 a 的第 3 个元素,其命令如下:
>> a(3)=[] a = 1×11 cell 数组 列 1 至 8 {[10]} {[12]} {'liu'} {'wang'} {'cai'} {2×2 double} {2×2 double} {2×2 double} 列 9 至 11 {0×0 double} {0×0 double} {1×1 struct}
单元矩阵 a 的第 3 个元素被删除侯,a 变成行向量。这里需要注意的是,这里是 a(3),而不是 a{3}。a{3}=[] 是将 a 的第 3 个元素置为空矩阵,而不是删除它。