QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 10399|回复: 8
打印 上一主题 下一主题

元胞数组

[复制链接]

522

主题

10

听众

4072

积分

自我介绍
学习中!

优秀斑竹奖 元老勋章 新人进步奖 最具活力勋章

群组Matlab讨论组

群组C 语言讨论组

群组每天多学一点点

群组数学趣味、游戏、IQ等

群组南京邮电大学数模协会

跳转到指定楼层
1#
发表于 2010-5-30 23:56 |只看该作者 |倒序浏览
前几天编写matlab程序,应用到cell函数,结果好长时间没搞懂,后来在网上查了些资料才弄明白,把资料给大家!

元胞数组:
    元胞数组是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)
      (8)元胞数组与数值数组间的转化
      应用循环,可以将元胞数组转化为数值数组。

转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
第一次用linux登录madio,纪念一下
linmatsas 实名认证       

53

主题

13

听众

3591

积分

逍遥游

自我介绍
额。。。。世界上最讨厌的事情就是自我介绍。。。

邮箱绑定达人 新人进步奖 发帖功臣 最具活力勋章

群组Matlab讨论组

群组数学建模

群组小草的客厅

群组2012数学一考研交流

群组C 语言讨论组

2#
发表于 2010-6-13 12:16 |只看该作者
回复

使用道具 举报

6

主题

5

听众

525

积分

邮箱绑定达人 新人进步奖

群组数学建模

群组Matlab讨论组

群组Linux推广

群组09年国际数学建模群—鹰之队

群组半**流

3#
发表于 2010-6-26 10:44 |只看该作者
回复

使用道具 举报

杨yyh        

14

主题

6

听众

380

积分

社区QQ达人 新人进步奖

群组LINGO

群组数学建模

群组Matlab讨论组

4#
发表于 2010-9-21 16:09 |只看该作者
回复

使用道具 举报

1

主题

3

听众

336

积分

群组Matlab讨论组

5#
发表于 2010-11-17 08:40 |只看该作者
元胞数组应该就像细胞一样,可大可小,比如卵细胞,神经细胞,肌肉细胞,它们都可以放在一起构成一个集合,也就数数组了。当然,它的元素也可以是细胞团,可以是组织,还可以是器官。
回复

使用道具 举报

22

主题

6

听众

438

积分

新人进步奖

群组Matlab讨论组

群组数学趣味、游戏、IQ等

群组数学建模培训课堂1

群组西南大学建模组

群组华中科技大学

6#
发表于 2011-1-12 13:33 |只看该作者
回复

使用道具 举报

8

主题

3

听众

148

积分

群组Matlab讨论组

群组西南大学建模组

群组数学建摸协会

群组机器人

群组湖南大学数学建模

7#
发表于 2011-1-14 15:07 |只看该作者
回复

使用道具 举报

8

主题

3

听众

148

积分

群组Matlab讨论组

群组西南大学建模组

群组数学建摸协会

群组机器人

群组湖南大学数学建模

8#
发表于 2011-1-14 15:08 |只看该作者
回复

使用道具 举报

lichunbo 实名认证       

0

主题

3

听众

35

积分

群组Matlab讨论组

群组数学建模

群组西安交大数学建模

9#
发表于 2011-2-9 15:44 |只看该作者
回复

使用道具 举报

qq
收缩
  • 电话咨询

  • 04714969085

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2025-8-4 06:31 , Processed in 0.578759 second(s), 66 queries .

回顶部