MATLAB元胞数组(cell array)用来装类型可以不同的数据。普通数组要求元素类型一致,字符串、数字、矩阵要放在同一容器里时,就用 cell。

和普通数组的区别

对比项普通数组元胞数组
元素类型必须相同可以不同
索引符号圆括号 ( )花括号 { }
典型用途数值计算、矩阵运算混合数据、动态结构

创建:花括号

C = {'2023-07-23', [10 20 30 40]}

这是一个 1x2 的 cell:第一格是字符串,第二格是数组,类型不同也可以。

想先预分配再填数据,用 cell 函数:

C = cell(2, 3);   % 2x3 的空 cell,每个格子是空数组
C{1, 1} = 'Hello';
C{1, 2} = 50;
C{1, 3} = [1 2 3];
C{2, 1} = 3.14;
C{2, 3} = magic(3);   % 每个格子类型、大小可以不同

动态增长

cell 可以随时加行、加列,不必事先定好最终大小:

C = {};
C(1, :) = {'2023-07-23', [10 20 30 40]};
C(2, :) = {'2023-07-24', [11 22 33 44]};
C(3, :) = {'2023-07-25', [1 2 3 4]};   % 自动长成 3x2

圆括号与花括号

圆括号取的是格子本身,花括号取的是格子里的内容:

C = {'red', [1 2 3]; 'blue', magic(2)} 'red' 格子(1,1) [1 2 3] 格子(1,2) 'blue' 格子(2,1) magic(2) 格子(2,2) C(1, 1) 圆括号 () 1×1 cell(容器) C{1, 1} 花括号 {} 'red'(里面的数据)
圆括号 () 取格子本身(得到 cell 容器),花括号 {} 取格子里的内容。
C = {'red', [1 2 3]; 'blue', magic(2)};

C(1, 1)     % 得到 1x1 cell,是装着 'red' 的容器
C{1, 1}     % 得到里面的数据,即字符串 'red'

记法可以记成:圆括号对着格子,花括号取出格子里的东西。

易错点

  • 该用 {} 却写了 ():想取字符串却得到 cell,后面做字符串操作往往会报错。
  • 一次取出多个格子却赋给单个变量:C{1, 1:2} 会返回两个值,应写成 [C{1,1:2}] 再接收。
  • size(C) 得到的是格子个数对应的尺寸,不是某个格子里数据的形状。