元胞数组:

    元胞数组是MATLAB的一种特殊数据类型,可以将元胞数组看做一种无所不包的通用矩阵,或者叫做广义矩阵。组成元胞数组的元素可以是任何一种数据类型的常数或者常量,每一个元素也可以具有不同的尺寸和内存占用空间,每一个元素的内容也可以完全不同,所以元胞数组的元素叫做元胞(cell)。和一般的数值矩阵一样,元胞数组的内存空间也是动态分配的。

关于cell的创建:

1.跟一般创建举证一样,直接使用C = {A B D E}这种形式,不过这里把"[]"改成了}"{}"

2.使用cell创建cell,C= {C1 C2},这里C1和C2都是cell类型,直接把C1 C2作为一个cell得到的C3是一个1x2的cell数组;使用C3 = [C1 C2],是使用C1和C2的内容来创建cell数组

3.使用cell函数,A=cell(2,2),创建一个空的2x2的cell矩阵.

用cell函数创建元胞数组,创建的数组为空元胞。cell函数创建空元胞数组的主要目的是为数组预先分配连续的存储空间,节约内存占用,提高执行效率。  

 

 

关于cell的访问:

1.X = C(s)使用这种"()"形式的返回的是cell类型

2.X = C{s}使用这种"{}"形式的返回的是cell中的内容

3.其他的基本上与通常的数组.矩阵访问一样了

4.A{1,1}(2,3:end)访问的是A中的第一个cell里面内容的第2行的第三个元素以后的所有元素

5.A{1,3}.name访问的是A中的A{1,3}cell里面结构的name值

6.cell的图形化显示使用命令cellplot(A)即可

 

元胞数组的数据获得:

   
从元胞数组中读取数据,可保存为一个标准的数组或一个新的单元数组,或取出数组进行计算。元胞数组中数据的访问,可通过元胞内容的下标进行,用元胞数组名加大括号{}。大括号中数值表示元胞的下标。如a{1,2}表示元胞数组中第一行第二列的元胞。

>> a={20,'matlab';ones(2,3),1:3}
a =
    [ 20]    'matlab'  

    [2x3 double]    [1x3 double]



>> str=a(1,2)
str =
    'matlab'>> class(str)
ans =
cell


>> str=a{1,2}
str =
matlab>> class(str)
ans =
char


()和{}有着本质的区别,大括号用于表示元胞的内容,小括号表示指定的元胞。

a =
    [   20]    'matlab'  

    [2x3 double]    [1x3 double]


>> a{2,1}(2,2)
ans =
    0.9134

>> a{2,1}(2,3)
ans =
    0.0975


>> a{1,2}(2)
ans =

a


使用元胞的下标,可将一个元胞数组的子集赋值给另一个变量,创建新的元胞数组。



>> a=[{1},{2},{3};{4},{5},{6};{7},{8},{9}]
a =
    [1]    [2]    [3]

    [4]    [5]    [6]

    [7]    [8]    [9]



>> b=a(2:3,2:3)
b =
    [5]    [6]

    [8]    [9]



>> c=a(1:3,2:3)
c =
    [2]    [3]

    [5]    [6]

    [8]    [9]



     本例使用元胞下标的方式创建了新的元胞数组b和c,通过结果看出b和c就是元胞数组a的一部分。

 

关于cell的删除和重塑:

1.cell(1)=[]删除第一个cell,不能使用cell{1}=[],这是把第一个cell内容置空没有删除

>>C4={C1,C2,C3}
C4 =
    {3x2 cell}    {3x3 cell}    {3x1 cell}
>> C4(1)=[]
C4 =
    {3x3 cell}    {3x1 cell}

 

2.cell(:)=[]删除所有的cell,其他的删除一次类推

>> C4(:)=[]
C4 =
     {}

 

3.使用reshape重新reshape cell arrays

>> A={1,2,3}
A =
    [1]    [2]    [3]
>> B = reshape(A, 1, 3);
>> B = reshape(A, 3, 1);
>> B = reshape(A, 2, 6);
??? Error using ==> reshape
To RESHAPE the number of elements must not change.


使用reshape需要保证前后调整后的元素个数一致,否则会报错

 

元胞数组中的操作函数
      cell:创建空的元胞数组

      cellfun:为元胞数组的每个元胞执行指定的函数

      celldisp:显示所有元胞的内容

      cellplot:利用图形方式显示元胞数组

      cell2mat:将元胞数组转变成为普通的矩阵

      mat2cell:将数值矩阵转变成为元胞数组

      num2cell:将数值数组转变成为元胞数组

      deal:将输入参数赋值给输出

      cell2struct:将元胞数组转变成为结构

      struct2cell:将结构转变为元胞数组

      iscell:判断输入是否为元胞数组

    

>> a={20,'matlab',3-7i;ones(2,3),1:3,0}

a =

    [        20]    'matlab'        [3.0000 - 7.0000i]
    [2x3 double]    [1x3 double]    [               0]

>> b=cellfun('isreal',a)

b =

     1     1     0
     1     1     1

>> c=cellfun('length',a)

c =

     1     6     1
     3     3     1

>> d=cellfun('isclass',a,'double')

d =

     1     0     1
     1     1     1



(函数的应用)

    cellfun函数的主要功能是对元胞数组的元素(元胞)分别指定不同的函数,不过,能够在cellfun函数中使用的函数ushuliang是有限的。 

    能在cellfun中使用的函数:

    isempty:若元胞元素为空,则返回逻辑真

    islogical:若元胞元素为逻辑类型,则返回逻辑真

    isreal:若元胞元素为实数,则返回逻辑真

    length:元胞元素的长度

    ndims:元胞元素的维数

    prodofsize:元胞元素包含的元素个数 

 

元胞数组的嵌套

    元胞数组的元胞中包含其他的元胞数,称为嵌套元胞数组,没有嵌套结构的元胞则称为页元胞。使用嵌套的大括号或cell函数,或直接用赋值表达式,都可以创建嵌套单元数组,另外还可以访问嵌套元胞数组的子数组、元胞或元胞的元素。

  

>> a=cell(1,2)

a =

     []     []

>> a(1,2)={cell(2,2)}

a =

     []    {2x2 cell}



    

>> a(1,1)={magic(3)};
a{1,2}(1,1)={[1 2 3;4 5 6;7 8 9]};
a{1,2}(2,1)={[2-i;4+7i]};
a{1,2}(2,2)={cell(1,2)};
a{1,2}{2,2}(2)={5};
>> cellplot(a)