MATLAB从基础到精通
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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]