MATLAB中的单元数组(英文cell),又称元胞数组,使用频率堪比结构体struct
单元数组和结构体的区别:
相同点:都可以存放不同类型的数据,能实现不同类型数据的存储
不同点:结构体中数组中的各个元素有对应的名称,以及成员;而单元数组中没有对应的成员以及成员名称
结构体一般使用struct(field,value),中间用逗号进行分割
单元数组一般使用{},中间一般用,(各项之间);(分行处理)进行分割
创建单元数组:
直接赋值法、利用函数cell()、利用{ }直接创建元胞数组的所有单元。
C = {'2017-08-16',[56 67 78]} C=1×2 cell array {'2017-08-16'} {[56 67 78]}
将不同日期的读数添加到元胞数组中。要添加更多元胞,您可以通过赋值来扩展元胞数组,就像扩展普通数组一样。
C(2,:) = {'2017-08-17',[58 69 79]}; C(3,:) = {'2017-08-18',[60 68 81]} C=3×2 cell array {'2017-08-16'} {[56 67 78]} {'2017-08-17'} {[58 69 79]} {'2017-08-18'} {[60 68 81]}
对 C
的第一行进行索引。当您使用圆括号 ()
进行索引时,将得到一个作为该元胞数组子集的元胞数组。
C(1,:) ans=1×2 cell array {'2017-08-16'} {[56 67 78]}
对元胞的内容进行索引。当您使用花括号 {}
进行索引时,将得到指定元胞中包含的数据段。
C{1,2} ans = 1×3 56 67 78
方形元胞数组
尝试此示例Copy Command Copy Code
创建一个由空矩阵构成的 3×3 元胞数组。
C = cell(3) C=3×3 cell array {0x0 double} {0x0 double} {0x0 double} {0x0 double} {0x0 double} {0x0 double} {0x0 double} {0x0 double} {0x0 double}
三维元胞数组
尝试此示例Copy Command Copy Code
创建一个由空矩阵构成的 3×4×2 元胞数组。
C = cell(3,4,2); size(C) ans = 1×3 3 4 2
根据现有数组克隆大小
尝试此示例Copy Command Copy Code
创建由大小与现有数组相同的空矩阵组成的元胞数组。
A = [7 9; 2 1; 8 3]; sz = size(A); C = cell(sz) C=3×2 cell array {0x0 double} {0x0 double} {0x0 double} {0x0 double} {0x0 double} {0x0 double}
通常可以将前两行代码合并成一行:
C = cell(size(A));
访问元胞数组中的数据
C = {'one', 'two', 'three'; 1, 2, 3} C=2×3 cell array {'one'} {'two'} {'three'} {[ 1]} {[ 2]} {[ 3]}
引用元胞数组的元素有两种方法。将索引括在圆括号 ()
中以引用元胞集,例如,用于定义一个数组子集。将索引括在花括号 {}
中以引用各个元胞中的文本、数字或其他数据。
使用圆括号 () 的元胞索引
圆括号中的元胞数组索引引用元胞集。例如,要创建一个属于 C
的子集的 2×2 元胞数组,请使用圆括号。
upperLeft = C(1:2,1:2) upperLeft=2×2 cell array {'one'} {'two'} {[ 1]} {[ 2]}
通过将元胞集替换为相同数量的元胞来更新这些元胞集。例如,将 C
的第一行中的元胞替换为大小相等 (1×3) 的元胞数组。
C(1,1:3) = {'first','second','third'} C=2×3 cell array {'first'} {'second'} {'third'} {[ 1]} {[ 2]} {[ 3]}
如果数组中的元胞包含数值数据,可以使用 cell2mat
函数将这些元胞转换为数值数组。
numericCells = C(2,1:3) numericCells=1×3 cell array {[1]} {[2]} {[3]} numericVector = cell2mat(numericCells) numericVector = 1×3 1 2 3
numericCells
是一个 1×3 的元胞数组,但 numericVector
是一个 double
类型的 1×3 数组。
使用花括号 {} 的内容索引
通过使用花括号进行索引来访问元胞的内容,即元胞中的数字、文本或其他数据。例如,要访问 C
的最后一个元胞的内容,请使用花括号。
last = C{2,3} last = 3
last
为一个 double
类型的数值变量,因为该元胞包含 double
值。
同样,您也可以使用花括号进行索引来替换元胞的内容。
C{2,3} = 300 C=2×3 cell array {'first'} {'second'} {'third'} {[ 1]} {[ 2]} {[ 300]}
您可以使用花括号进行索引来访问多个元胞的内容。MATLAB® 会以逗号分隔的列表形式返回这些元胞的内容。因为每个元胞可以包含不同类型的数据,所以无法将此列表分配给单个变量。但是,您可以将此列表分配给与元胞数量相同的变量。MATLAB® 将按列顺序赋给变量。
将 C
的四个元胞的内容赋给四个变量。
[r1c1, r2c1, r1c2, r2c2] = C{1:2,1:2} r1c1 = 'first' r2c1 = 1 r1c2 = 'second' r2c2 = 2
如果每个元胞都包含相同类型的数据,则可以通过将数组串联运算符 []
应用于逗号分隔的列表来创建单个变量。
将第二行的内容串联到数值数组中。
nums = [C{2,:}] nums = 1×3 1 2 300
访问部分元胞的多级索引
myNum = [1, 2, 3]; myCell = {'one', 'two'}; myStruct.Field1 = ones(3); myStruct.Field2 = 5*ones(5); C = {myNum, 100*myNum; myCell, myStruct} C=2×2 cell array {[ 1 2 3]} {[100 200 300]} {1x2 cell} {1x1 struct }
使用花括号 {}
访问特定元胞的完整内容。例如,从包含某个数值向量的元胞返回该向量。
C{1,2} ans = 1×3 100 200 300
通过追加索引,并使用与内容的数据类型匹配的语法,来访问元胞的部分内容。
使用圆括号将数值索引括起来。例如,C{1,1}
返回一个 1×3 数值向量 [1 2 3]
。使用圆括号访问该向量的第二个元素。
C{1,1}(1,2) ans = 2
将元胞数组索引括在花括号中。例如,C{2,1}
返回元胞数组 {'one','two'}
。使用花括号访问该元胞数组中的第二个元胞的内容。
C{2,1}{1,2} ans = 'two'
使用圆点表示法引用结构体数组的字段,并按对数值和元胞数组的说明为数组建立索引。例如,C{2,2}
返回一个结构体数组,其中 Field2
包含一个由 5 构成的 5×5 数值数组。使用圆点表示法和圆括号访问该字段的第 5 行和第 1 列中的元素。
C{2,2}.Field2(5,1) ans = 5
您可以嵌套任何数量的元胞和结构体数组。例如,将嵌套的元胞和结构体添加到 C
。
C{2,1}{2,2} = {pi, eps}; C{2,2}.Field3 = struct('NestedField1', rand(3), ... 'NestedField2', magic(4), ... 'NestedField3', {{'text'; 'more text'}} );
使用花括号、圆括号或圆点表示法访问部分新数据。
copy_pi = C{2,1}{2,2}{1,1} copy_pi = 3.1416 part_magic = C{2,2}.Field3.NestedField2(1:2,1:2) part_magic = 2×2 16 2 5 11 nested_cell = C{2,2}.Field3.NestedField3{2,1} nested_cell = 'more text'
删除单元数组
删除列。
令单元数组某一列的所有单元都等于空,即删除了这一列。删除第三行如下:
删除行。
令单元数组某一行的所有单元都等于空,即删除了这一行。删除第二行如下:
删除某个元素。
可以使用setdiff来进行两个数组的差集。
a=[3 1 7 2 4 8]; b=[7 8]; [c i]=setdiff(a,b); x=a(sort(i))
改变单元数组
直接利用下标进行修改元素,单元数组中下标是1,不是0。(矩阵也有类似操作)
a=[3 1 7 2 4 8];
a(3) = 9;
a