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{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的一部分。
(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)
大家一定要注意,元胞是元胞,元胞的内容是元胞的内容,这是完全不同的,看下面这个例子。

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

首先手动创建一个元胞数组a。下面进行操作。

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

上面是直接修改元胞中的内容,a{1,1}表示第一行、第一列的元胞中的内容,则a{1,1}=3表示将该元胞中的内容修改为3。是直接对元胞中的内容进行操作。

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

上面是直接修改元胞,a(1,1)表示第一行、第一列的元胞,{3}也是 一个元胞,则a(1,1)={3}表示a(1,1)这个元胞修改为{3}这个元胞,是直接对元胞进行操作。



     

  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值