MATLAB的cell数组

5  Cell数组

元胞数组(cell)是MATLAB的一种特殊数据类型。可以将元胞数组看做一种无所不包的通用矩阵,或者叫做广义矩阵。组成元胞数组的元素可以是任何一种数据类型的常数或者常量,每一个元素也可以具有不同的尺寸和内存占用空间,每一个元素的内容也可以完全不同。和一般的数值矩阵一样,元胞数组的内存空间也是动态分配的。图3-3是元胞数组的结构示意图,表示的是一个2´3的元胞数组。元胞数组的第1行包括了无符号整数、字符串数组和一个复数数组,第2行包括了其他3种类型的数组,其中最后一个是另外的元胞数组的嵌套。

图3-3元胞数组结构示意图

和数值数组一样,元胞数组的维数不受限制,元胞数组可以是一维的、二维的,也可以是多维的。对元胞数组的元素进行寻访,可以使用“单下标”方式或者“全下标”方式。

结构数组和元胞数组有着非常相似的功能,但是二者又有所区别,具体比较如下。

结构数组和元胞数组在使用目的上类似,都是提供一种存储混合格式数据的方法。二者最大的区别在于:结构数组存储数据的容器称做“域”,而元胞数组是通过数字下标索引来进行访问的。

结构数组经常用于重要数据的组织存储。而元胞数组因为采用数字下标,所以经常在循环控制流中使用。元胞数组还常被用来存储不同长度的字符串。

在实际应用中,二者一般可以随意选择,多数情况下无论选用其中哪一种类型都可以达到目的,用户可以根据自己的习惯和实际应用来决定。

5.1  Cell数组的创建

组成元胞数组的数据可以是任意类型的数据,所以在创建元胞数组之前需要创建相应的数据。本小节结合具体的实例介绍创建元胞数组的方法。

在表现形式上,元胞数组和一般矩阵一样,元胞数组的尺寸也必须是长方形的。一般矩阵的创建使用中括号" [ ]",而元胞数组使用的是花括号"{ }"。元胞数组的创建方式同矩阵的创建方式类似,只需要将中括号" [ ]"替换为花括号"{ }"即可。在元胞数组创建的过程中使用逗号或者空格来分隔元素,使用分号来分行。

【例3-21】  创建元胞数组示例。

>> A = {[1 4 3; 0 5 8; 7 2 9], 'Anne Smith'; 3+7i, -pi:pi/4:pi};

>> A

A =

    [3x3 double]    'Anne Smith'

    [3.0000 + 7.0000i]    [1x9 double]

本例中元胞数组A的第一个元素是一个数值矩阵,矩阵的输入只需要使用正常的中括号" [ ]"即可。而第一行第二列字符串也是正常使用单引号即可。

【例3-22】  嵌套元胞数组创建示例。

(1)直接创建嵌套元胞数组,只需要将内层和外层的元胞数组都用花括号括起来即可。

>> header = {'Name', 'Age', 'Pulse/Temp/BP'};    %  元胞数组的创建

>> records(1,:) = {'Kelly', 49, {58, 98.3, [103, 72]}};%  嵌套元胞数组的创建

>> header, records

header =

    'Name'    'Age'    'Pulse/Temp/BP'

records =

    'Kelly'    [49]    {1x3 cell}

(2)通过分步来创建元胞数组则更加清楚明了。

>> vitalsigns = {60, 98.4, [105, 75]};

>> records(1,:) = {'Kelly', 49, vitalsigns}

%  将元胞数组vitalsigns嵌套进records

records =

    'Kelly'    [49]    {1x3 cell}

【例3-23】  依次创建元胞数组示例。

用户还可以通过每次创建一个元胞的方式,依次创建元胞数组,MATLAB会根据表达式依次对原有的元胞数组进行扩展,从而建立新的元胞数组。例如:

>> A(1,1) = {[1 4 3; 0 5 8; 7 2 9]};

>> A(1,2) = {'Anne Smith'};

>> A(2,1) = {3+7i};

>> A(2,2) = {-pi:pi/4:pi};

如果用户对超出数组尺寸的元胞进行赋值,那么MATLAB就会自动扩展至新的尺寸,以将新赋的值包括进来。例如将上面的A由2´2扩展为3´3,可以使用如下命令:

>> A(3,3) = {5};

扩展之后的元胞数组A示意图如图3-4所示。

图3-4元胞数组A示意图

除了上面所讲的方法之外,MATLAB还提供了一个专门的函数来建立元胞数组,即cell函数。cell函数用于创建一维、二维或者多维空元胞数组。

【例3-24】  创建空元胞数组示例。

>> a=cell(1)

a =

    {[]}

>> b=cell(3,3)

b =

     []     []     []

     []     []     []

     []     []     []

>> c=cell(2,2,2)

c(:,:,1) =

     []     []

     []     []

c(:,:,2) =

     []     []

     []     []

>> whos

  Name      Size             Bytes  Class    Attributes

  a         1x1                  8  cell               

  b         3x3                 72  cell               

  c         2x2x2               64  cell               

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

5.2  Cell数组的寻访

元胞数组的寻访和一般数组的寻访类似,但是情况更为复杂。

对于二维数组A来说,A(2,4)表示的就是数组第2行第4列上的元素。但是对域元胞数组来说就不这么简单了。在元胞数组中,元胞和元胞里的内容是两个不同范畴的东西。因此,寻访元胞和元胞中的内容是两种不同的操作。为寻访不同的内容MATLAB设计了两种不同寻访的方法:“元胞外标识(cell indexing)”和“元胞内编址(Content addressing)”。

以元胞数组A为例,A(2,4)指的是元胞数组中的第2行第4列的元胞元素,而A{2,4}指的则是元胞数组中的第2行第4列的元胞内容。注意:这两种方式的区别仅在于使用的括号不同。

【例3-25】  元胞数组的寻访示例。

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

a =

    [        20]    'matlab'    

    [2x3 double]    [1x3 double]

>> str=a{1,2}       %  返回字符型数组str,a{1,2}表示对应元胞的内容

str =

matlab

>> class(str)       %  查看变量str的数据类型,结果确为字符型

ans =

char

>> str2=a(1,2)      %  a(1,2)表示元胞数组中的一个元胞

str2 =

    'matlab'

>> class(str2)      %  查看变量str2的数据类型,结果为元胞数组

ans =

cell

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容