matlab cell的用法


MATLAB中的CELL用法

Matlab里面元包(Cell)的概念,其元包就是一个类似矩阵的东西,但是它的特点就是矩阵的每一项可以放任何的元素,比如:

>> MyCell

MyCell =

Columns 1 through 2

    [16x16 double]    'i am a string'

Column 3

    [1x1 struct]

MyCell的第一项是一个16x16的矩阵,第二项是一个字符串,第三项是个结构体。
Cell的使用其实也很简单,和矩阵的用法备尝的类似,不同的矩阵采用()作为访问的表示,如a(1)=10;但是元包是采用花括号的,如MyCell{1}=zeros(16,16),当然元包也可以有矩阵的形式MyCell{i,j}(其实元包也可以可用MyCell(i,j),但是从字面上看不出和一般的矩阵有任何的区别,我个人还是建议使用花括号)。

再回到开头的问题,那么就用一个1 x N的元包组来记录这些数据,每个元包就放置一个矩阵即可。
首先要要创建一个元包用来存放数据,这里有两种方法

(1) DataCell = Cell(1,N);
(2) DataCell{N} = [];

这两种方法的效果是一样产生了一个1 X N的元包,没有元素都是空的。
使用的时候也很简单 DataCell{1} = DataArray。其中DataArray就是要存储的某一行数据。
要访问某行数据也很简单 DataCell{2}(7) 就是表示第2个元包的数组的第7个元素。
此外元包还有自己的可视化工具,celldisp()和cellplot()分别用作显示元包的内容和画出元包。

a=cell(n,m)

那么就把a初始化为一个n行m列的空cell类型数据。

如何赋值呢?

a{1,1}=rand(5)  //赋值

那么a的1行1列的单元中存储的就是一个随机的5×5的方阵了。

那么要用第一个单元中的方阵中的某个值呢?

可以如下引用:a{1,1}(2,3)

就可以了,引用cell单元时要用{},再引用矩阵的某个数据就要用()了。

cell单元中的每个单元都是独立的,可以分别存储不同大小的矩阵或不同类型的数据。




matlab cell数组

       cell数组是MATLAB的一种特殊矩阵,或者叫做广义矩阵。矩阵的每个元素可以是任何一种数据类型的常数、常量或者矩阵,所以矩阵的每个的元素叫做cell。和一般的数值矩阵一样,元胞数组的内存空间也是动态分配的。

      在做图像处理的时候需要用到一维数组,数组的元素为一个3×3的像素矩阵。而矩阵式不能作为一般数值数组的元素的。这样就必须用到cell数组。具体应用如下:

StarPic=cell(0);

for j=1:1:i-1

    StarPic{j}=[PicAllNew(MaxPix(1,j)-1,MaxPix(2,j)-1) PicAllNew(MaxPix(1,j)-1,MaxPix(2,j)) PicAllNew(MaxPix(1,j)-1,MaxPix(2,j)+1); ...

                 PicAllNew(MaxPix(1,j),MaxPix(2,j)-1) PicAllNew(MaxPix(1,j),MaxPix(2,j)) PicAllNew(MaxPix(1,j),MaxPix(2,j)+1); ...

                 PicAllNew(MaxPix(1,j)+1,MaxPix(2,j)-1) PicAllNew(MaxPix(1,j)+1,MaxPix(2,j)) PicAllNew(MaxPix(1,j)+1,MaxPix(2,j)+1)];

end

a=StarPic{1}

class(a)

b=StarPic(1)

class(b)

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

>> a=cell(0);

   a={}

>>a=cell(1)

   a={[]}

>>a=cell(3,3)

   a=[ ] [ ] [ ]

       [ ] [ ] [ ]

       [ ] [ ] [ ]

      2、 从元胞数组中读取数据,可保存为一个标准的数组或一个新的单元数组,或取出数组进行计算。

通过小括号()里面加下标,访问cell数组中的数据,返回的是对应的cell。
  通过大括号{}里面加下标,访问cell数组中的数据,返回的是对应cell的内容。

在上面的具体应用中,a的数据类型为:double,且a=[1.3 1.2. 1.4;1.3 1.2 1.4;1.2 1.4 1.3]

b的数据类型为cellb=[3×3 double]

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

       4、 元胞数组的删除和重塑

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

a={123,'abcde';zeros(3,5),ones(3,3)}

a =

    [       123]    'abcde'    
    [3x5 double]    [3x3 double]

>> a(1,:)=[]

a =

    [3x5 double]    [3x3 double]

>> a={123,'abcde';zeros(3,5),ones(3,3)}

a =

    [       123]    'abcde'    
    [3x5 double]    [3x3 double]

>> a{1}=[]

a =

              []    'abcde'    
    [3x5 double]    [3x3 double]

>> a={123,'abcde';zeros(3,5),ones(3,3)}

a =

    [       123]    'abcde'    
    [3x5 double]    [3x3 double]

>> a(1)=[]

a =

    [3x5 double]    'abcde'    [3x3 double]

>> a={123,'abcde';zeros(3,5),ones(3,3)}

a =

    [       123]    'abcde'    
    [3x5 double]    [3x3 double]

>> a(2)=[]

a =

    [123]    'abcde'    [3x3 double]

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

a={123,'abcde';zeros(3,5),ones(3,3)}

a =

    [       123]    'abcde'    
    [3x5 double]    [3x3 double]

>> size a

ans =

     1     1

>> size(a)

ans =

     2     2

>> b=reshape(a,1,4)

b =

    [123]    [3x5 double]    'abcde'    [3x3 double]

>> size(b)

ans =

     1    4

5、元胞数组中的操作函数
      cell
:创建空的元胞数组
      cellfun
:为元胞数组的每个元胞执行指定的函数
      celldisp
:显示所有元胞的内容
      cellplot
:利用图形方式显示元胞数组
    
cell2mat:将元胞数组转变成为普通的矩阵
      mat2cell
:将数值矩阵转变成为元胞数组
      num2cell
:将数值数组转变成为元胞数组
      deal
:将输入参数赋值给输出
      cell2struct
:将元胞数组转变成为结构
      struct2cell
:将结构转变为元胞数组
      iscell
:判断输入是否为元胞数组

cellfun函数的主要功能是对元胞数组的元素(元胞)分别指定不同的函数,不过,能够在cellfun函数中使用的函数ushuliang是有限的。 
   
能在cellfun中使用的函数:
    isempty
:若元胞元素为空,则返回逻辑真
    islogical
:若元胞元素为逻辑类型,则返回逻辑真
    isreal
:若元胞元素为实数,则返回逻辑真
    length
:元胞元素的长
    ndims
:元胞元素的维数
    prodofsize
:元胞元素包含的元素个数

举例:

a={123,'abcde';1-7i,ones(3,3)}

a =

    [             123]    'abcde'    
    [1.0000 - 7.0000i]    [3x3 double]

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

b =

     1     1
     0     1

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

c =

     1     5
     1     3

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

d =

     1     0
     1     1

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





你可能感兴趣的:(matlab)