Matlab中的元胞数组
1、Matlab中的元胞数组(cell)
元胞数组(Cell Array)将类型不同的相关数据集成到一个单一的变量中,使得大量相关数据的引用和处理变得简单方便。元胞数组每个元素为一个元胞,元胞可以是任意类型、任意尺寸的数据。cell元胞数组功能强大,内部可以混搭存储不同类型的数据。
如下图为一个2*2类型的元胞数组
可以把整个元胞数组想象成一栋楼,里面有四个房间(两行两列分布),每个房间内的存储的数据类型可以完全不同(甚至可以嵌套)。
1.1 元胞数组(Cell Array)创建方法:
(1)使用大括号 { } 直接创建元胞数组(的所有单元)
格式:元胞数组名 = {元胞...元胞}
cellname={[cell 1,1] , [cell 1,2],......,[cell 1,n] ; ...... ; [cell m,1],[cell m,2],......,[cell m,n]};
%此即为创建了一个 m×n 的元胞数组,并将单元进行了初始化。
这是一种快捷的元胞数组创建方法,利用{ }可以直接快速地创建所需元胞数组。在大括号中一次列出所需创建元胞数组的内容,它们之间用逗号(,)隔开,行与行之间用分号(;)隔开,这样就可以创建一个已经初始化好的元胞数组。
例1:
1 2 3 |
|
例2:
(2)单元索引法创建元胞数组:使用元胞创建元胞数组
格式:元胞数组名(指定索引)= {元胞}
赋值语句的左边用小括号()将标识单元的下标括起来,右边用大括号将存储于单元中的数据括起来。
例1:
1 2 3 4 5 |
|
例2:
把元胞数组想象成大楼,大楼的某个楼层的某个位置有一个房间(1*1的元胞),房间内部又有一个柜子(矩阵),柜子内部有很多小格子,每个小格子里存一个数字。
单元索引法:元胞数组名(指定索引)= {元胞} %相当于指定了大楼的某个楼层的某个位置,这个位置处必然有一个房间;
内容索引法:元胞数组名{指定索引}= 元胞内容 %相当于指定了某个大楼的具体某个房间,这个房间内部存在一个柜子(矩阵)
(3)由元胞内容创建元胞数组
格式:元胞数组名{指定索引}= 元胞内容
ps: 利用函数cell() 可以创建一个元胞数组,还可以规定其大小。
例1:
1 2 3 4 5 |
|
例2:
c1=cell(2,3)
c1{1,1}='dog' ;
c1{1,2}='cat' ;
c1{1,3}='bird' ;
c1{2,1}=800 ;
c1{2,2}=500 ;
c1{2,3}=120 ;
disp(c1)
例3:
例4:分别使用三种方法创建一个2*3类型的元胞数组
方法1:大括号{ }法,直接创建元胞数组
c11=[0:2:10]
c12=[3,-15,0;12,-9,11]
c13='matlab'
c21=['abcd';'efgh']
c22=randn(3,4,2)
c23={'gdcp',2019 ;'room',[16,512]} %c23本身也是一个元胞数组
A={c11,c12,c13;c21,c22,c23} %元胞数组的嵌套:A内部的c23也是元胞数组
方法2:单元索引法创建元胞数组;
%右边为一个个小元胞,左边指定其在大的元胞的单元格位置
A(1,1)={[0:2:10]};
A(1,2)={[3,-15,0;12,-9,11]};
A(1,3)={'matlab'};
A(2,1)={['abcd';'efgh']};
A(2,2)={randn(3,4,2)};
A(2,3)={ {'gdcp',2019 ;'room',[16,512]} }; %元胞数组的嵌套...
A
方法3:内容索引法创建元胞数组
%左边表示元胞的某个单元格的内容,右边为内容的具体数据
A{1,1}=[0:2:10];
A{1,2}=[3,-15,0;12,-9,11];
A{1,3}='matlab';
A{2,1}=['abcd';'efgh'];
A{2,2}=randn(3,4,2);
A{2,3}={'gdcp',2019 ;'room',[16,512]} ; %元胞数组的嵌套...
A
上面三种方式是等价的,其中第二种方式使用单元索引赋值,而第三种方式使用内容索引赋值.
1.2元胞数组(Cell Array)显示:
(1)使用celldisp显示元胞数组
1 2 3 4 5 6 |
|
(2)使用cellplot显示元胞数组
1 2 3 4 5 6 |
|
1.3元胞数组(Cell Array)访问:
在编程时,一个元胞数组的每一个单元都是一个指针,指向其他的数据结构,而这些数据结构可以是不同的数据类型。在MATLAB中,元胞数组创建时,没有显示内容单元的内容,显示的只是它相应的数据类型。而MATLAB可以通过单元的名称来寻访其单元包含的内容。
通过()访问cell数组时访问到的是cell单元,通过{ }访问cell数组时访问到的是cell单元储存的内容。
(1)使用大括号{ } 访问元胞数组的内容
元胞数组{下标}
元胞数组{下标}(下标)
1 2 3 4 5 6 7 8 |
|
(2)使用小括号( ) 访问元胞数组的单元
元胞数组(下标)
1 2 3 4 5 6 7 |
|
例1:元胞数组内容的索引
A{1,1}=[0:2:10];
A{1,2}=[3,-15,0;12,-9,11];
A{1,3}='matlab';
A{2,1}=['abcd';'efgh'];
A{2,2}=randn(3,4,2);
A{2,3}={'gdcp',2019 ;'room',[16,512]} ;
A
A{1,2} %找到元胞数组A中第1行第2列的内容
A{1,2}(2,1) %找到元胞数组A中第1行第2列的内容,然后再在内容里面找第2行第1列的元素。
A{1,3}
A{1,3}(3)
A{2,1}(2,2)
A{2,2}(2,3,1)
A{2,3}
A{2,3}{2,1}
A{2,3}{2,1}(4)
1.4元胞数组(Cell Array)删除:
元胞数组及普通数组的删除都可以通过空矩阵[ ] 来实现,
实现元胞数组删除操作区别就在于{ } 和 ( )
1.5元胞数组(Cell Array)的相关函数:
元胞数组的常用函数
函数 | 作用 |
cell | 创建一个元胞数组 |
iscell | 判断某变量是否为元胞数组 |
reshape | 改变cell的形状 |
cell2mat | 将元胞数组转为矩阵 |
cell2struct | 将元胞数组转为结构体 |
mat2cell | 将数组转换为指定大小元胞数组 |
num2cell | 将数组转换为相同大小的元胞数组 |
struct2cell | 将结构体转换为元胞数组 |
celldisp | 递归显示元胞数组中的内容 |
cellplot | 以图像形式绘制元胞数组的结构 |
cellfun | 对元胞数组的每个元胞应用某函数 |
(1)· cellplot:利用图形方式显示内容
(2)reshape函数改变元胞数组的形状
1.6 高维元胞数组
一个三维的元胞数组可以有行(row),列(column),层(layer)三个维度.在对元胞数组进行索引时,优先级从高到低的顺序分别是: 行→列→层.
使用cat函数可以在指定维度上对元胞数组进行拼接.
=================================
作业1:
(1)创建一个5行4列的元胞数组,要求:第一行是4个字符串,依次为:'姓名','籍贯','学号','电话';第2-5行分别是4个具体同学的实例。
(2)创建好之后,显示输出(celldisp)该元胞数组内容,并画出(cellplot)其结构。
(3)分别对具体某个学生的姓名或者学号、电话等,进行索引。
作业2:
创建一个4行5列的元胞数组,此元胞数组中的每一个单元都是一个字符串(假设为网站中用户注册时分配的初始用户名),此字符串长度为6,这6个字母是从62个字符(26个字母的大小写,加上10个数字字符)中随机选择的。
提示:
>> x='a':1:'z'
x =
'abcdefghijklmnopqrstuvwxyz'
>> x( [randi(26,1,3)] )
ans =
'vxd'
或:
x='a':1:'z'
y=x( [randperm(26)] )
y(1:3)
x =
'abcdefghijklmnopqrstuvwxyz'
y =
'mnideoywjbukzacsthrpxqvlfg'
ans =
'mni'
==================================
=================================== =======================================
补充:
(1)num2cell函数
将数组转换为相同大小的元胞数组
C = num2cell(A)
C = num2cell(A,dim)
C = num2cell(A) 通过将 A 的每个元素放置于 C 的一个单独元胞中,来将数组 A 转换为元胞数组 C。
num2cell 函数转换具有任意数据类型(甚至是非数值类型)的数组。
C = num2cell(A,dim) 将 A 的内容划分成 C 中单独的元胞,其中 dim 指定每个元胞包含 A 的哪个维度。dim 可以是维度的标量或向量。例如,如果 A 有 2 行 3 列,那么:
num2cell(A,1) 创建一个 1×3 元胞数组 C,其中每个元胞包含 A 的 2×1 列。
num2cell(A,2) 创建一个 2×1 元胞数组 C,其中每个元胞包含 A 的 1×3 行。
num2cell(A,[1 2]) 创建一个 1×1 元胞数组 C,其中每个元胞包含 A 整个数组。
示例:将一个数值数组的所有元素放入单独的元胞。
a = magic(3)
a = 3×3
8 1 6
3 5 7
4 9 2
c = num2cell(a)
c=3×3 cell array
{[8]} {[1]} {[6]}
{[3]} {[5]} {[7]}
{[4]} {[9]} {[2]}
将一个单词的各个字母放入数组的各个元胞中。
a = ['four';'five';'nine']
a = 3x4 char array
'four'
'five'
'nine'
c = num2cell(a)
c = 3x4 cell
{'f'} {'o'} {'u'} {'r'}
{'f'} {'i' } {'v'} {'e'}
{'n'} {'i'} {'n'} {'e'}
(2)矩阵分块函数 mat2cell
mat2cell 函数就是将矩阵转化成胞元数组(cell array),用数学的语言讲就是矩阵分块。x是60*50的大矩阵。
例:Divide Array and Return Subarrays in Cell Array
A = reshape(1:20,5,4)'
A = 4×5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
%Divide A into two 2-by-3 and two 2-by-2 subarrays. Return the subarrays in a cell array.
C = mat2cell(A,[2 2],[3 2])
C=2×2 cell array
{2x3 double} {2x2 double}
{2x3 double} {2x2 double}
%Display the subarrays in C using the celldisp function.
celldisp(C)
C{1,1} =
1 2 3
6 7 8
C{2,1} =
11 12 13
16 17 18
C{1,2} =
4 5
9 10
C{2,2} =
14 15
19 20
mat2cell和num2cell综合演示: