matlab初学matlab——单元数组

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'

删除单元数组

删除列。

令单元数组某一列的所有单元都等于空,即删除了这一列。删除第三行如下:

matlab初学matlab——单元数组_第1张图片

删除行。

令单元数组某一行的所有单元都等于空,即删除了这一行。删除第二行如下:

matlab初学matlab——单元数组_第2张图片

删除某个元素。

可以使用setdiff来进行两个数组的差集。

matlab初学matlab——单元数组_第3张图片

a=[3 1 7 2 4 8];
b=[7 8];
[c i]=setdiff(a,b);
x=a(sort(i))

改变单元数组

直接利用下标进行修改元素,单元数组中下标是1,不是0。(矩阵也有类似操作)

matlab初学matlab——单元数组_第4张图片

a=[3 1 7 2 4 8];
a(3) = 9;
a

你可能感兴趣的