12 Matlab 元胞数组

什么是元胞数组

前面咱们介绍过矩阵的概念,但是矩阵有一个缺陷,它只能存储同一种类型的数据。同一个矩阵中,要么都是数字,要么就都是字符串。元胞数组 ( Cell Array ) 就可以解决这个问题。

这里插播一个问题:一会儿说矩阵一会儿又说数组的,这两个是一回事吗?

严格意义上,数组比矩阵的概念外延更大一些。矩阵单纯由数字元素构成,而数组不仅可以是数字元素,也可以是字符元素

在前面,我已经混着用了,所以,将错就错下去了,不再区分这两个概念。

回到正题。类似于矩阵的概念,元胞数组也是由多个 “ 元胞 ” ( cell )数据排排座构成的。元胞是一种比较特殊的东西,它可以保存任意一种类型的数据。这样一来,元胞数组就成了一种可以包含各种类型和大小的数据的数组。

在上一篇教程里面我们用 xlsread 函数读了一个 excel 表格。其中,返回值 raw 的结果如下:

raw =
  4×3 cell 数组
    {'标题1'}    {'标题2'}    {'标题3'}
    {[   11]}    {[   21]}    {[   31]}
    {[   12]}    {[   22]}    {[   32]}
    {[   13]}    {[   23]}    {[   33]}

它原样照搬了 excel 表格中的内容,但是表格里的数据有两种类型:标题是字符串的,而每列下面的内容却又是数字的。如果你用创建矩阵的写法来写这样的数据是会报错的。试试看:

>> a = ['标题1', '标题2', '标题3';11, 21, 31]
串联的矩阵的维度不一致。

有关 “ 串联矩阵的维度不一致的问题 ” 大家还可以自己试试下面这些例子:

>> ['hello', 'world']
ans =
    'helloworld'
>> ['hello'; 'world']
ans =
  2×5 char 数组
    'hello'
    'world'
>> ['hello'; 'world !']
串联的矩阵的维度不一致。
>> ['hello', 'world !']
ans =
    'helloworld !'

通过这些例子,大家仔细体会一下下面的逻辑:

一个矩阵对元素的数据类型与大小有限制,但是元胞数组没有这种限制。

对元胞数组的理解,需要了解两个东西:首先,一个元胞可以保存任意类型与大小的数据;其次,元胞数组是多个元胞组成的矩阵,因此,元胞数组就成了一个可以保存各种类型和大小的数据的数组。

元胞数组的创建与引用

元胞数组的创建

类似于使用 [ ] 运算符创建矩阵的方法,使用 { } 创建元胞数组。示例:

>> data = {'name', 'gender', 'score'; 'John', 'male', 98}

data =
  2×3 cell 数组
    {'name'}    {'gender'}    {'score'}
    {'John'}    {'male'  }    {[   98]}
引用元胞数组中的元素

在这里先要搞清楚要引用的是元胞还是元胞中的数据,不然在下面涉及到 ( ){ } 的时候会晕菜 。

前面说过,元胞数组就是由元胞构成的矩阵。在上面的例子中,命令行中显示的结果中, data 是由六个 { } 括起来的数据构成。这六个 { } 括起来的数据是元胞。引用元胞数组的元胞时采用 ( ) 运算符。 例如,取元胞数组 data 的第二行所有列数据:

>> data(2, :)

ans =
  1×3 cell 数组
    {'John'}    {'male'}    {[98]}

取第二行第二列的元胞:

>> data(2,2)

ans =
  1×1 cell 数组
    {'male'}

请注意,到目前为止,所获得的数据仍然是元胞数组。

再往前走一步,每个 { } 括起来的数据,是元胞里面的数据。例如,字符串 name 是 data 中第一个元胞的数据内容;98 是 data 中最后一个元胞里的内容。 访问元胞中的内容时,使用{ } 运算符。例如,取第二行所有元胞中的数据:

>> data{2, :}

ans =
    'John'

ans =
    'male'

ans =
    98

这里,我们没有将这三个数据分别赋值,Matlab 自动使用 ans 变量接受数据。请注意,这时候取到的值是字符串或数字。

如果我们希望将这三个数值都保存下来,可以设定三个变量分别接受这三个数据,如:

>> [a, b, c] = data{2, :};

请仔细体会元胞元胞中的内容二者的区别,能正确区分使用 { }( )运算符。

元胞数组的元胞添加、删除与合并操作

与矩阵元素添加、删除及合并操作类似,只是运算符号变成了{ }, 分别举例说明。

添加元胞至元胞数组:

>> data = {1,2,3}

data =
  1×3 cell 数组
    {[1]}    {[2]}    {[3]}
>> data(4) = {4}

data =
  1×4 cell 数组
    {[1]}    {[2]}    {[3]}    {[4]}

元胞数组的删除操作有两类
一种是删除元胞数组某个元胞中的内容

>> data{3} = []

data =
  1×4 cell 数组
    {[1]}    {[2]}    {0×0 double}    {[4]}

另一种是删除元胞数组中的某个元胞

>> data(3) = []

data =
  1×3 cell 数组
    {[1]}    {[2]}    {[4]}

请结合前面介绍的 { }( ) 的区别,仔细体会上面的两句代码。

合并元胞数组:
先创建三个元胞数组:

data1 = {1,2,3};
data2 = {'a', 'b', 'c'};
data3 = {4,5,6};

这三个数组都是 1X3 的元胞数组,如果我希望合并成一个 3X3 的元胞数组,应该采用数组运算符 [ ]

>> data = [ data1; data2; data3 ]

data =
  3×3 cell 数组
    {[1]}    {[2]}    {[3]}
    {'a'}    {'b'}    {'c'}
    {[4]}    {[5]}    {[6]}

可能有同学要晕菜了。

我们前面讲过创建一个矩阵(或者是数组)用 [ ] 运算符。请注意,元胞数组它本质上仍然是一个数组。将这三个元胞数组串联合并,应该是生成一个新的数组,只不过这个数组是由元胞构成。请结合教程中有关矩阵操作的那部分再琢磨下。

继续,现在我们希望将这三个元胞数组合并成一个 1X3 的元胞数组:

>> data_cell1 = {data1, data2, data3}

data_cell =
  1×3 cell 数组
    {1×3 cell}    {1×3 cell}    {1×3 cell}

这里 data_cell1 是一个 1X3 的元胞数组,每个元胞又是分别由 data1, data2, data3 这样的 1X3 元胞数组构成。

最后,再给出一个例子,请说明这样的数组是怎么构成的。

>> data_cell2 = {data1; data2; data3};

有关元胞数组的内容就更到这里了,有点小复杂,仔细琢磨下元胞数组元胞以及元胞中的数据这三者的区别,就能正确使用 ( )[ ] 以及 { }

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

推荐阅读更多精彩内容

  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 3,828评论 0 0
  • 来源:NumPy Tutorial - TutorialsPoint 译者:飞龙 协议:CC BY-NC-SA 4...
    布客飞龙阅读 32,692评论 6 96
  • 基础篇NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(...
    oyan99阅读 5,112评论 0 18
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,154评论 1 44
  • 哇兴奋兴奋!Tokyo Disneyland!就是太晒了,我出门于是就忘了涂防晒霜???人真心好多啊,人山人海的,...
    想喝阿华田阅读 317评论 0 1