2.5 元胞数组
元胞数组是由可以包括任何数据类型的元胞组成的数组。通过元胞数组的使用,可以在同一个变量中存储不同数据类型的数据,给代码的编写带来很大便利。
2.5.1 元胞数组的创建
元胞数组的创建方法主要有直接赋值法和函数法。直接赋值法是指直接在命令行中给元胞数组的每个元素赋值,或者使用大括号“{ }”创建元胞数组。函数法是指使用MATLAB提供的cell()函数创建元胞数组。
1.直接赋值法
元胞数组的直接赋值可以使用小括号“( )”括起元胞的下标,此时元胞中的内容需要使用大括号“{ }”括起来。如果使用大括号“{ }”括起元胞的下标时,元胞中的内容无须另加标点,与一般数组的元素输入相同。这两种方法的效果是一样的,但要注意符号前后的配合。
使用大括号“{ }”创建元胞数组的方法类似于使用中括号“[ ]”生成一般的数组,行之间元素用分号“;”分隔,列之间的元素用逗号“,”或者空格分隔。
【例2.15】直接赋值法创建元胞数组。
%元胞下标使用小括号创建元胞数组 >> a{1,1}=8; >> a{1,2}='cell study'; >> a{2,1}=magic(3); >> a{2,2}=magic(3)>5; >> a a = [ 8] 'cell study' [3x3 double] [3x3 logical] %元胞下标使用大括号创建元胞数组 >> b(1,1)={8}; >> b(1,2)={'cell study'}; >> b(2,1)={magic(3)}; >> b(2,2)={magic(3)>5}; >> b b = [ 8] 'cell study' [3x3 double] [3x3 logical] %使用大括号“{ }”创建元胞数组 >> {8, 'cell study';magic(3),magic(3)>5} ans = [ 8] 'cell study' [3x3 double] [3x3 logical]
2.函数法
利用cell()函数生成元胞数组的过程,可以理解为是一个先利用函数对元胞内存空间预分配,然后对元胞中的元素进行赋值。Cell()函数的用法如下。
● x= cell(n):生成n×n的元胞数组x。
● x= cell(m,n)或者x = cell([m n]):生成m×n的元胞数组x。
● x = cell(m,n,p,...)或者x = cell([m n p…]):生成m×n×p的元胞数组x。
● x = cell(size(A)):生成与数据A具有相同大小的元胞数组x。
【例2.16】函数法创建元胞数组。
>> a=cell(2) %生成2×2的元胞数组a a = [] [] [] [] >> a={1,'c';2,cell(3)};%给生成的元胞数组赋值 >> a a = [1] 'c' [2] {3x3 cell}
2.5.2 元胞数组的访问
MATLAB 7.0中对元胞数组的访问提供了大括号和小括号两种方式,其中大括号访问的是元胞数组中元胞的内容,可以对元胞中的内容进行进一步的操作,而小括号访问的是元胞数组的元胞,是个整体,无法对元胞中的具体数据进行操作。
1.利用大括号访问元胞数组
利用大括号可以访问到元胞数组内元素具体的内容,并可对其中的数据执行具体的操作。
【例2.17】利用大括号访问元胞数组。
>> a={8, 'cell study';magic(3),magic(3)>5} %创建元胞数组 a = [ 8] 'cell study' [3x3 double] [3x3 logical] >> a{1,1} %访问元胞数组的第1行第1列的元胞内容 ans = 8 >> a{2,1} %访问元胞数组的第2行第1列的元胞内容 ans = 8 1 6 3 5 7 4 9 2 >> a{1,:} %访问元胞数组的第1行中的所有元胞内容 ans = 8 ans = cell study >> a{:,2} %访问元胞数组的第2列中的所有元胞内容 ans = cell study ans = 1 0 1 0 0 1 0 1 0 >> a{2,1}(2,2) %访问元胞数组内元胞子数据的内容 ans = 5 >> a{1,1}+8 ans = 16
2.利用小括号访问元胞数组
利用小括号访问元胞数组是访问元胞数组中元胞的整体,不可以访问元胞数组中的具体元素运算。
【例2.18】利用小括号访问元胞数组。
>> a={8, 'cell study';magic(3),magic(3)>5};%创建元胞数组 >> a(1,1) %访问到元胞数组的元胞整体 ans = [8] >> a(1,1)+8 %不可以对元胞数组的元胞整体进行运算 ??? Function 'plus' is not defined for values of class 'cell'. Error in ==> plus at 14 builtin('plus', varargin{:});
2.5.3 元胞数组的显示
MATLAB中提供了celldisp()和cellplot()函数用于显示元胞数组。Celldisp()函数可以显示元胞数组的具体内容,而cellplot()函数以图形方式显示元胞数组。函数的具体用法如下。
● celldisp(s):用于显示元胞数组s中的具体内容。
● celldisp(s,name):以字符串name为元胞名,显示元胞数组s中的具体内容。
● cellplot(s):以图形化的方式显示元胞数组s。
● cellplot(s,'legend'):以图形化的方式显示元胞数组s,同时显示不同数据类型的颜色图例标注。
【例2.19】元胞数组的显示。
>> a={8, 'cell study';magic(3),magic(3)>5}; >> celldisp(a) %显示元胞数组a中的具体内容 a{1,1} = 8 a{2,1} = 8 1 6 3 5 7 4 9 2 a{1,2} = cell study a{2,2} = 1 0 1 0 0 1 0 1 0 >> celldisp(a,'s') %以s为元胞数组名,显示元胞数组a中的具体内容 s{1,1} = 8 s{2,1} = 8 1 6 3 5 7 4 9 2 s{1,2} = cell study s{2,2} = 1 0 1 0 0 1 0 1 0 >> cellplot(a) %以图形化的方式显示元胞数组的内容,如图2.1所示。
图2.1 以图形化的方式显示元胞数组
2.5.4 元胞数组的删除
元胞数组的删除主要是通过把需要删除的元胞赋值为空来实现。通过大括号和小括号访问元胞并将其置空,可以分别删除元胞数组的内容或整体。
1.利用大括号删除元胞数组的内容
利用大括号可以删除元胞数组元胞内的具体内容,可以删除单个元胞及其中的具体元素,但不可删除一行或一列元胞数组内容。
【例2.20】利用大括号删除元胞数组的内容。
>> a={8, 'cell study';magic(3),magic(3)>5}; >> a{1,1}=[]; %删除元胞数组内单个元胞 >> a a = [] 'cell study' [3x3 double] [3x3 logical] >> a{2,1}=[]; %删除元胞数组内单个元胞 >> a a = [] 'cell study' [] [3x3 logical] >> a{2,2}(1,:)=[]; %删除元胞数组内单个元胞的具体元素 >> a a = [] 'cell study' [] [2x3 logical] >> a{1,:}=[] %不可以通过大括号删除元胞数组的一行或一列元素 ??? Insufficient outputs from right hand side to satisfy comma separated list expansion on left hand side.Missing [] are the most likely cause.
2.利用小括号删除元胞数组的元胞
利用小括号可以删除元胞数组的元胞整体,可以删除一行或一列的元胞,但不可以删除其中具体的一个元胞。
【例2.21】利用小括号删除元胞数组的内容。
>> a={8, 'cell study';magic(3),magic(3)>5}; >> a(1,1)=[]; %删除单个元胞整体,出错 ??? A null assignment can have only one non-colon index. >> a(1,:)=[]; %删除元胞数组的一行 >> a a = [3x3 double] [3x3 logical] >> a(:,2)=[] %删除元胞数组的一列 a = [3x3 double]