在使用 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 ,形成一个新的元胞数组。

参考链接[1]:https://www.jianshu.com/p/8efd86ac2337

参考链接[2]:http://www.ece.northwestern.edu/local-apps/matlabhelp/techdoc/matlab_prog/ch13_c12.html#48680


长风破浪会有时,直挂云帆济沧海。