在使用 Matlab 的过程中经常遇到元胞数组(Cell Arrays),以前对元胞数组的用法和寻址方式模模糊糊,今天就把元胞数组彻底剖析清楚。
1.元胞数组(Cell)的创建方式
可以通过以下两种方式创建Cell元胞数组:使用赋值语句
使用 cell 函数预分配数组,然后将数据分配给单元
在此之前,有必要了解一下元胞数组的结构以及存储数据的方式。
元胞数组是 MATLAB 中的一种特殊数组,数组的元素叫做 cell,cell 可以作为容纳其他 MATLAB 数组的容器。可以将元胞数组看做一种无所不包的通用矩阵,或者叫做广义矩阵。例如,一个元胞数组中的一个 cell 单元可能包含一个实矩阵,另一个 cell 单元可能包含文本字符串数组,再一个 cell 单元可能包含复数向量。也就是说它的每个单元可以储存不同的数据类型,可以是数值,字符或矩阵或元胞数组等。
下图所示的是一个 2×3 的元胞数组的结构,每一个格子都是一个 cell 单元,单元里面存储的数据类型不尽相同。
元胞数组第1行的3个单元包括了整数数组、字符串数组和一个复数数组,第2行的3个单元包括了行向量 、整数数组 以及另外一个元胞数组的嵌套。
和数值数组一样,元胞数组的维数不受限制,元胞数组可以是一维的、二维的,也可以是多维的。对元胞数组的元素进行寻访,可以使用“单下标”方式或者“全下标”的方式。在表现形式上,元胞数组和一般矩阵一样,元胞数组的尺寸也必须是长方形的。一般矩阵的创建使用中括号 "[ ]" ,而元胞数组使用的是花括号 "{ }" 。元胞数组的创建方式同矩阵的创建方式类似,只需要将中括号 "[ ]" 替换为花括号 "{ }" 即可。在元胞数组创建的过程中使用逗号或者空格来分隔元素,使用分号来分行。
(1)使用赋值语句创建
您可以通过将数据分配给单个单元(一次一个单元)来构建元胞数组。构建完成后 MATLAB 会自动创建元胞数组。有两种将数据分配给单元的方法:
a.单元索引赋值
例如,创建一个2×2的元胞数组 A,使用单元索引时,数组的下标需要用圆括号 "( )" ,等式右边单元里存放的内容元素需用大括号 "{ }" 括起来。A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};
A(1,2) = {'Anne Smith'};
A(2,1) = {3+7i};
A(2,2) = {-pi:pi/10:pi};
b.内容索引赋值
创建一个与上面相同的元胞数组 A ,由于是直接进行内容索引,数组的下标需要用 "{ }" 括起来,索引等式的右边直接写要存放的内容元素即可。A{1,1} = [1 4 3; 0 5 8; 7 2 9];
A{1,2} = 'Anne Smith';
A{2,1} = 3+7i;
A{2,2} = -pi:pi/10:pi;
在Matlab中元胞数组 A 显示为:A =
2×2 cell 数组
{3×3 double } {'Anne Smith'}
{[3.0000 + 7.0000i]} {1×21 double }
其次,celldisp() 函数可以显示完整的元胞数组:>> celldisp(A)
A{1,1} =
1 4 3
0 5 8
7 2 9
A{2,1} =
3.0000 + 7.0000i
A{1,2} =
Anne Smith
A{2,2} =
1 至 7 列
-3.1416 -2.8274 -2.5133 -2.1991 -1.8850 -1.5708 -1.2566
8 至 14 列
-0.9425 -0.6283 -0.3142 0 0.3142 0.6283 0.9425
15 至 21 列
1.2566 1.5708 1.8850 2.1991 2.5133 2.8274 3.1416
如果将数据分配给当前数组维度之外的单元 ,MATLAB 会自动扩展数组以包括指定的下标。并且 Matlab 会自动用空矩阵填充所有空缺的单元。例如,以下赋值将2×2的元胞数组 A 变成3×3的元胞数组。A(3,3)= {5};>> A(3,3)= {5}
A =
3×3 cell 数组
{3×3 double } {'Anne Smith'} {0×0 double}
{[3.0000 + 7.0000i]} {1×21 double } {0×0 double}
{0×0 double } {0×0 double } {[ 5]}
此时,元胞数组的结构如下:
(2)使用 Cell 函数预分配数组创建
cell 函数允许用户预分配指定大小的空元胞数组。例如,下面的语句创建了一个空的2×3元胞数组。B = cell(2,3);
再使用赋值语句进行内容的填充:B(1,3) = {1:3};
结果如下:>> B = cell(2,3);
>> B(1,3) = {1:3};
>> B
B =
2×3 cell 数组
{0×0 double} {0×0 double} {1×3 double}
{0×0 double} {0×0 double} {0×0 double}
2.元胞数组(Cell)的访问方式
元胞数组的访问主要有以下2种方式:使用内容索引访问单元内容,下标用 { }
使用单元索引访问单元结构类型,下标用 ( )
X= C(a,b) 使用这种 "( )" 形式的返回的是cell类
X = C{a,b} 使用这种 "{ }" 形式的返回的是cell中的内容
(1)内容索引访问
考虑下面这个2×2的元胞数组:N{1,1} = [1 2; 4 5];
N{1,2} = 'Name';
N{2,1} = 2-4i;
N{2,2} = 7;
你可以通过 N{1,2} 来获取里面存储的字符串内容:>> N{1,2}
ans =
'Name'
要获取单元内容的子集,可以连接索引表达式。例如,要获取 N{1,1}单元内容中的(2,2)元素,可以使用:d = N{1,1}(2,2)>> d = N{1,1}(2,2)
d =
5
(2)单元索引访问
还是上面元胞数组 N ,如果输入的是 N(2,1),则返回的是单元的类型:>> N(2,1)
ans =
1×1 cell 数组
{[2.0000 - 4.0000i]}
使用单元索引可以将任何一组单元分配给另一个变量,从而创建一个新的元胞数组。使用冒号运算符访问元胞数组中的单元子集。例如,将元胞数组 A 中的第2行第3行,第2列第3列的单元赋给 B ,形成一个新的元胞数组。