在 MATLAB 中,有两种基本的数据类型,一个是数值型数据,一个是字符型数据或称字符串数据。
数值型数据比较好理解,是指能参与数值运算的数据,又分为整型、浮点型和复数型。
字符型数据在日常应用中则不太强调,但却是大量存在的,例如统计一篇英文文章中不同英文字母出现的次数,按姓名排序,等等。字符串数据由若干个字符组成,这些字符可以是计算机系统中允许使用的任何字符。
1. 字符串的表示
-
在 MATLAB 中,字符串是单引号括起来的字符序列。
>> x='yan zi 22'
'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 =
需要注意的是,这里要求各行字符数要相等。为此,有时不得不用空格来调节各行的长度,使它们彼此相等。
例如,我们建立一个字符串向量,然后对该向量做如下处理。
(1) 取第 1~5 个字符组成的子字符串。
(2) 将字符串倒过来重新排列。
(3) 将字符串中的小写字母变成相应的大写字母,其余字符不变。
(4) 统计字符串中小写字母的个数。
>> A='ABc123d4e56Fg9';
>> A1=A(1:5)
'ABc12'
>> A2=A(end:-1:1)
'9gF65e4d321cBA'
>> k=find(A>='a'&A<='z');
>> A(k)=A(k)-('a'-'A')
'ABC123D4E56FG9'
>> length(k)
ans =
2. 字符串的操作
其中,s 是字符串。
字符串比较函数用于判断字符串是否相等,有 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。
-
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
ans =
包含以下字段的 struct:
x1: 12
x2: 'wang'
x3: [2×2 double]
包含以下字段的 1×3 struct 数组:
引用结构矩阵元素的成员时,显示其值。引用结构矩阵元素时,显示成员名和它的值,但成员是矩阵时,不显示其具体内容,只显示成员矩阵大小参数。引用结构矩阵时,只显示结构矩阵的大小参数和成员名。
1.2 结构成员的修改
-
可以根据需要增加或删除结构的成员。例如,我们要给结构矩阵 a 增加一一个成员 x4, 可给 a 中任意一个元素增加成员 x4,命令如下:
-
但其他成员均为空矩阵,可以使用赋值语句给它赋确定的值。
-
要删除结构的成员,则可以使用
rmfield
函数来完成。例如,要删除成员 x4,命令如下:
2. 单元数据
-
单元数据类型与结构数据类型类似,也是把不同属性的数据放在一个变量中。不同的是,结构矩阵的各个元素下有成员,每个成员都有自己的名字,对成员的引用如下:
-
而单元矩阵的各个元素就是不同类型的数据,用带有大括号下标的形式引用单元矩阵元素。
-
建立单元矩阵和一般矩阵相似,只是矩阵元素用大括号括起来。
>> a={10,'liu',[11,21;34,78];12,'wang',[34,191;27,578];14,'cai',[13,890;67,231]}
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)=[]
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 个元素置为空矩阵,而不是删除它。