详细介绍matlab中的cell数组

1、什么是cell数组?

        在matlab中,‘ cell ’是一种数据类型,用于存储不同类型的数组或不同大小的数组。‘ cell ’数组可以包含任意类型的数据,包括其他 ’ cell ‘数组。使用 ’ cell ‘ 数组可以有效地组织和处理各种类型的数据。下面是help中对cell数组的介绍:

对于定义如果觉得难以理解,那么目前只需要记住一件事:cell数组就是一个包含许多个数组的数组 ,关于{ }  与( )如何使用,会在后面的例子中理解。

2、利用cell函数创建cell数组:

(1)C = cell( n );返回由空矩阵构成的 n*n 元胞数组。其中 n 的定义如下:

       举例,C=cell(4);结果如下,可以看到当n=4时生成一个4*4的元胞数组,且元胞数组内每个位置都是一个空矩阵。

         同时要注意,数据类型包含double,不是在创建cell数组时可以输入小数,而是数组内存储元素的数值类型,当输入如下代码时,仍然会报错。

C=cell(4.5);

(2)  C = cell( sz1 , ... , szN ); 返回由空矩阵构成的 sz1×...×szN 元胞数组,其中sz1,...,szN 表示每个维度的大小。(在定义cell时,cell函数内有几个数,且用逗号隔开,就会生成几维的元胞数组)sz1...szN的定义如下:

 举例1,C=cell(2,3); 结果如下,可以看到生成一个2行3列的元胞数组,且元胞数组内每个位置都是一个空矩阵/空数组。

举例2,C=cell(2,3,4); 结果如下,可以看到生成一个三维的2*3*4的元胞数组,且元胞数组内每个位置都是一个空矩阵。 

        当用size函数来计算创建的元胞数组大小时,num=size(C)  输出如下,如果C是4维,则生成一个1*4的向量。

举例3,C=cell(2,3,4,5); 结果如下,可以看到生成一个四维的2*3*4*5的元胞数组,且元胞数组内每个位置都是一个空矩阵。就这样依次类推,就不再展示。 

之前定义元胞数组都是用逗号将数组隔开,那如果用分号隔开会有什么效果?举例如下,很明显在用cell函数去创建cell数组时数字之间不能用分号,只有在为数组赋值时可以,后面详细介绍。

C=cell(2;3);

 

(3)  C = cell( sz ); 返回由空矩阵构成的元胞数组,并由大小向量 sz 来定义数组大小。sz的定义如下;

 举例,C=cell( [2,3] );    D=cell([2,3,4]);

注:可以看到 cell(2,3) 和 cell([2,3])生成的元胞数组没有区别,但是在C = cell(sz)的定义里可以看到,sz并不是数值,而是由整数组成的行向量。那么利用该方法创建cell数组时就可以写成如下形式,因此在写代码时就变的更加灵活。

a=[2 3 4];
C=cell(a);

(4)  D = cell( obj ); 可将 Java 数组、.NET System.String 或 System.Object 数组或者 Python 序列转换为 MATLAB 元胞数组。这里就不再详细介绍。

3、通过直接赋值创建cell数组:

        在matlab的帮助文档中给出的解释是:使用花括号 { }进行索引来访问元胞的内容,当要将数据放入一个元胞数组中时,使用元胞数组构造运算符 { } 创建该数组。示例及运行结果如下:

C = {1,2,3; 'text', rand(5,10,2), {11; 22; 33};zeros(2,3),'matlab',[1,3,5;6,8,10]};

依次打开其中第2行2列的5*10*2的数组、2行3列位置的3*1的元胞数组、3行3列位置的数组如下:

这里要注意当给cell数组赋值时,如果某一位置是[ ]定义的向量,则看作是一个二维数组,如果仍是由{ }构成,则是在cell数组内的新的cell数组,如下

通过这个示例就可以明白通过赋值创建元胞数组的特点如下 :

        创建元胞数组与普通二维数组类似,每行的各个位置用逗号分隔,分号 ’;’代表一行结束, 区别在于创建时要使用花括号{ },且与二维数组相比,各个位置不仅可以是单个数值,还可以是数组,字符串乃至另一个元胞数组等。

        根据cell数组特点,那么是否可以换一种方法来创建一个cell数组,代码和结果如下,可以发现这样定义matlab中的 cell 数组 和c语言中的结构体非常类似,可以用相同的思路去处理代码,但其作用包括不仅限于此。


name='LiMing';   %定义字符串变量,名字
age=22;    %定义数值变量,年龄
grades=[95,91,98];   %定义数组,分数

others=cell(2,2);  %定义一个包含其他数据的新cell数组
others{1,1}=10;
others{1,2}='2000-01-12';

imformation={name,age;grades,others};  %根据定义好的各种变量创建一个包含个人信息的元胞数组

#include <stdio.h>
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};

4、cell数组的索引问题:

①( )与 { } 的区别

C = {          1,              2,                3; 
          'text',   rand(5,10,2),     {11; 22; 33};
      zeros(2,3),       'matlab',  [1,3,5;6,8,10]};

       仍然以此元胞数组举例,当使用圆括号( ) 进行索引时,将得到一个作为该元胞数组子集的元胞数组,比如对 C 的第一行和第二行进行索引,C(1 , : ); C(2,: ); 结果如下:

因此不可以使用( )索引为cell数组某一位置进行赋值,代码及报错如下:

C = {          1,              2,                3; 
          'text',   rand(5,10,2),     {11; 22; 33};
      zeros(2,3),       'matlab',  [1,3,5;6,8,10]};

C(2,2)=4;

         当使用花括号 { } 进行索引时,将得到指定元胞中包含的数据段,即访问cell数组的内容。仍然以C为例,通过 { } 访问C中的第三行第三列,结果如下。

C = {          1,              2,                3; 
          'text',   rand(5,10,2),     {11; 22; 33};
      zeros(2,3),       'matlab',  [1,3,5;6,8,10]};

        由此可见,使用{ }可以访问元胞数组的内容, 固然可以为cell数组某一位置进行赋值,代码及结果如下:

②cell数组内的数组索引(多级索引)问题

 既然可以通过{ }访问cell数组对应位置内容,那么cell数组内的三维普通数组的位置如何访问?

C = {          1,              2,                3; 
          'text',   rand(5,10,2),     {11; 22; 33};
      zeros(2,3),       'matlab',  [1,3,5;6,8,10]};

同样以元胞数组C为例,可以看到该元胞数组的第二行第二列定义了一个三维的随机数组,如下:

       那么我想通过元胞数组C访问数组rand(5,10,2) 的val(:,:,2)中的第二行第二列,代码如下,可以看到,首先使用{ }访问cell数组对应位置的数组,然后后面接( )访问该数组的对应位置。

       同理,要访问cell数组内的cell数组某个位置,则需要两个花括号C{ a,b} {a1,b1},如下图所示。 我想给cell数组C的第二行第三列的cell数组中的第二行第一列赋值为2,代码及结果如下:

C = {          1,              2,                3; 
          'text',   rand(5,10,2),     {11; 22; 33};
      zeros(2,3),       'matlab',   [1,3,5;6,8,10]};

C{2,3}{2,1}=2

③将元胞数组添加到元胞数组

④访问cell数组内的数据 

⑤删除元胞数组内的数据

⑥ 关于结构体多级索引问题

myNum = [1, 2, 3];
myCell = {'one', 'two'};
myStruct.Field1 = ones(3);
myStruct.Field2 = 5*ones(5);

C = {myNum, 100*myNum;   %创建一个元胞数组
     myCell, myStruct}

 ⑦将元胞数组内容传递给函数

首先创建一个元胞数组randCell,然后对其内容进行访问绘图,如果如下:

randCell = {'随机数组', rand(20,2)};
plot(randCell{1,2})
title(randCell{1,1})

通过进一步对内容进行索引(多级索引)来仅绘制数据的第一列,代码和结果如下:

randCell = {'随机数组', rand(20,2)};
figure
plot(randCell{1,2}(:,1))
title('第一列数据')

 ⑧使用 cell2mat 合并多个元胞中的数值数据

⑨将多个元胞的内容作为以逗号分隔的列表传递给函数 

⑩元胞数组与结构体数组 

 

5、关于cell数组的函数有哪些?

创建空数组
cell元胞数组
转换和检查类型
cell2mat将元胞数组转换为基础数据类型的普通数组
cell2struct将元胞数组转换为结构体数组
cell2table将元胞数组转换为表
cellstr转换为字符向量元胞数组
mat2cell将数组转换为在元胞中包含子数组的元胞数组
num2cell将数组转换为相同大小的元胞数组
struct2cell

将结构体转换为元胞数组

table2cell将表转换为元胞数组
iscell确定输入是否为元胞数组
iscellstr确定输入是否为字符向量元胞数组
处理内容
celldisp显示元胞数组内容
cellfun对元胞数组中的每个元胞应用函数
cellplot以图形方式显示元胞数组的结构体

 

 


 

  • 36
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

做完作业了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值