楼主: jxnu_xx
2235 5

[讨论交流] matlab学习-元胞数组 (转自网络博客) [推广有奖]

  • 8关注
  • 3粉丝

副教授

1%

还不是VIP/贵宾

-

威望
1
论坛币
532 个
通用积分
13.0632
学术水平
29 点
热心指数
29 点
信用等级
28 点
经验
27533 点
帖子
265
精华
1
在线时间
476 小时
注册时间
2014-11-1
最后登录
2024-6-13

楼主
jxnu_xx 发表于 2015-1-19 09:52:33 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

        最近在学matlab,在用matlab处理数据时经常要用到元胞数组,对这个数据类型不大熟悉,今天专门百度了一下,现在也把这些记录在这,方便以后查找。从excel读取之后自动存为元胞数组cell格式,因为涉及到数字和文本,所以需要将元胞数组进行转化。在调用的时候也需要注意格式,现在对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

(6)函数的应用

    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)


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:MATLAB matla atlab Lab Atl matlab excel cell

已有 1 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
fantuanxiaot + 15 + 20 + 1 + 1 + 1 欢迎多多转载

总评分: 经验 + 15  论坛币 + 20  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

沙发
fantuanxiaot 发表于 2015-1-19 10:29:27
欢迎多多转载这样的帖子 可以把多个转载的内容整合成一个帖子 整理整理 我可以加分更多

藤椅
fantuanxiaot 发表于 2015-1-19 10:34:58
加油 加油

板凳
jxnu_xx 发表于 2015-1-19 13:18:15
fantuanxiaot 发表于 2015-1-19 10:29
欢迎多多转载这样的帖子 可以把多个转载的内容整合成一个帖子 整理整理 我可以加分更多
好的,有空了多写点,多谢版主

报纸
jxnu_xx 发表于 2015-1-19 13:19:26
fantuanxiaot 发表于 2015-1-19 10:34
加油 加油
没想到转载的内容也可以,哈哈,意料之外
已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
fantuanxiaot + 5 + 1 + 1 + 1 鼓励积极发帖讨论

总评分: 经验 + 5  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

地板
fantuanxiaot 发表于 2015-1-19 13:32:49
jxnu_xx 发表于 2015-1-19 13:19
没想到转载的内容也可以,哈哈,意料之外
恩 转载的代码帖子 资源帖子 整合一个 奖励多多

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2026-1-6 10:29