zoukankan      html  css  js  c++  java
  • MATLAB元胞数组

    MATLAB元胞数组


    元胞数组:

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

         1)元胞数组的创建

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

    a =

        'matlab'            [20]
        [2x3 double]    [1x10 double]

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

    b =

        'matlab'            [20]
        [2x3 double]    [1x10 double]

    >> c={10}

    c =

        [10]

    >> c(1,2)={2}

    c =

        [10]    [2]

    >> c(2,2)={5}

    c =

        [10]    [2]
          []    [5]

    >> isequal(a,b)

    ans =

         1

    >> whos
    Name      Size            Bytes Class      Attributes

    a         2x2               388 cell                 
    ans       1x1                 1 logical              
    b         2x2               388 cell                 
    c         2x2               208 cell   

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

    >> a=cell(1)

    a =

        {[]}

    >> b=cell(1,2)

    b =

         []     []

    >> c=cell(3,3)

    c =

         []     []     []
         []     []     []
         []     []     []

    >> d=cell(2,2,2)

    d(:,:,1) =

         []     []
         []     []

    d(:,:,2) =

         []     []
         []     []

    >> whos
    Name      Size             Bytes Class      Attributes

    a         1x1                  4 cell                 
    ans       1x1                  1 logical              
    b         1x2                  8 cell                 
    c         3x3                 36 cell                 
    d         2x2x2               32 cell   

       2)元胞数组的数据获得

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

    >> 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]

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

         3)元胞数组的删除和重塑

         要删除单元数组中的行或列,可以用冒号表示单元数组中的行或列,然后对其赋一个空矩阵即可。   

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

    a =

        [20]                 'matlab'    
        [2x3 double]    [1x3 double]

    >> a(1,:)=[]

    a =

        [2x3 double]    [1x3 double]

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

    a =

                  []    'matlab'    
        [2x3 double]    [1x3 double]

    >> a(1)=[]

    a =

        [2x3 double]    'matlab'    [1x3 double]

    >> a(2)=[]

    a =

        [2x3 double]    [1x3 double]

    >> a(1,2)=[]
     A null assignment can have only one non-colon index.

    >> a(1)=[]

    a =

        [1x3 double]

         元宝数组和其他数组一样,也可以通过reshape函数改变形状,改变后的元胞数组与原元胞数组的元素个数相同,不能通过改变形状来添加或删除元胞数组中的元素。

    >> a=cell(4,4)

    a =

         []     []     []     []
         []     []     []     []
         []     []     []     []
         []     []     []     []

    >> size(a)

    ans =

         4     4

    >> b=reshape(a,2,8)

    b =

         []     []     []     []     []     []     []     []
         []     []     []     []     []     []     []     []

    >> size(b)

    ans =

         2     8

         5)元胞数组中的操作函数

          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:元胞元素包含的元素个数

        7)元胞数组的嵌套

        元胞数组的元胞中包含其他的元胞数,称为嵌套元胞数组,没有嵌套结构的元胞则称为页元胞。使用嵌套的大括号或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)

          8)元胞数组与数值数组间的转化

          应用循环,可以将元胞数组转化为数值数组。

    如何初始化元胞数组


    比如申请了2*2的元胞,希望初始化为每个元胞都是[0 0 0]


    cell  Create cell array.

        cell(N) is an N-by-N cell array of empty matrices.

     

        cell(M,N) or cell([M,N]) is an M-by-N cell array of empty

        matrices.

     

        cell(M,N,P,...) or cell([M N P ...]) is an M-by-N-by-P-by-...

        cell array of empty matrices.

     

        cell(SIZE(A)) is a cell array the same size as A containing

    all empty matrices.


    >>d=cell(2);

    >>d(:)={[0]};


    >> d = cell(2, 2);

    >> d

    d =

         []     []

         []     []

    >> d(:) = {[0 0 0]}

    d =

        [1x3 double]    [1x3 double]

        [1x3 double]    [1x3 double]

    >> celldisp(d)

     

    d{1,1} =

     

         0     0     0

     

    d{2,1} =

     

         0     0     0

     

    d{1,2} =

     

         0     0     0

     

    d{2,2} =

     

         0     0     0


    >> a = {[0 0 0]};

    >> b = repmat(a, 2, 2)

    b =

        [1x3 double]    [1x3 double]

        [1x3 double]    [1x3 double]

    >> celldisp(b)

     

    b{1,1} =

     

         0     0     0

      

    b{2,1} =

     

         0     0     0

      

    b{1,2} =

     

         0     0     0

      

    b{2,2} =

     

         0     0     0

  • 相关阅读:
    C语言I博客作业05
    C语言I博客作业04
    C语言II博客作业01
    学期总结
    第一周作业
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
    C语言I博客作业04
  • 原文地址:https://www.cnblogs.com/AI-Algorithms/p/3669861.html
Copyright © 2011-2022 走看看