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)};figureplot(randCell{1,2}(:,1))title('第一列数据')
⑧使用 cell2mat
合并多个元胞中的数值数据
⑨将多个元胞的内容作为以逗号分隔的列表传递给函数
⑩元胞数组与结构体数组
5、关于cell数组的函数有哪些?
创建空数组 | |
cell | 元胞数组 |
转换和检查类型 | |
cell2mat | 将元胞数组转换为基础数据类型的普通数组 |
cell2struct | 将元胞数组转换为结构体数组 |
cell2table | 将元胞数组转换为表 |
cellstr | 转换为字符向量元胞数组 |
mat2cell | 将数组转换为在元胞中包含子数组的元胞数组 |
num2cell | 将数组转换为相同大小的元胞数组 |
struct2cell | 将结构体转换为元胞数组 |
table2cell | 将表转换为元胞数组 |
iscell | 确定输入是否为元胞数组 |
iscellstr | 确定输入是否为字符向量元胞数组 |
处理内容 | |
celldisp | 显示元胞数组内容 |
cellfun | 对元胞数组中的每个元胞应用函数 |
cellplot | 以图形方式显示元胞数组的结构体 |