详细介绍matlab中的cell数组

做完作业了 2024-07-14 14:35:01 阅读 69

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数组时可以输入小数,而是数组内存储元素的数值类型,当输入如下代码时,仍然会报错。

<code>C=cell(4.5);

(2)  C = cell( sz1 , ... , szN ); 返回由空矩阵构成的 <code>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数组时数字之间不能用分号,只有在为数组赋值时可以,后面详细介绍。

<code>C=cell(2;3);

 

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

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

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

<code>a=[2 3 4];

C=cell(a);

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

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

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

<code>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语言中的结构体非常类似,可以用相同的思路去处理代码,但其作用包括不仅限于此。

<code>

name='LiMing'; %定义字符串变量,名字code>

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}; %根据定义好的各种变量创建一个包含个人信息的元胞数组

<code>#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数组某一位置进行赋值,代码及报错如下:

<code>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中的第三行第三列,结果如下。

<code>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数组内的三维普通数组的位置如何访问?

<code>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,代码及结果如下:

<code>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数组内的数据 

⑤删除元胞数组内的数据

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

<code>myNum = [1, 2, 3];

myCell = {'one', 'two'};

myStruct.Field1 = ones(3);

myStruct.Field2 = 5*ones(5);

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

myCell, myStruct}

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

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

<code>randCell = {'随机数组', rand(20,2)};

plot(randCell{1,2})

title(randCell{1,1})

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

<code>randCell = {'随机数组', rand(20,2)};

figure

plot(randCell{1,2}(:,1))

title('第一列数据')

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

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

⑩元胞数组与结构体数组 

 

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

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

将结构体转换为元胞数组

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

 

 

 



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。