本节介绍 MATLAB 元胞数组(cell array):在元素类型不必相同的前提下,用二维网格存放字符串、数值、矩阵等混合数据。普通数组要求元素同类型;若必须在同一容器内保存异质元素,应选用元胞数组。

和普通数组的区别

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

创建:花括号

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

上例为 1×2 元胞数组:第一格为字符串,第二格为数值数组,元素类型可以不同。

想先预分配再填数据,用 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) 得到的是元胞网格的尺寸,不是某一格内数组自身的形状。

本节说明了元胞数组与普通数组的差异、创建与动态扩展,以及圆括号与花括号索引的区别。下一节介绍表格:带列名的列式数据结构,便于读写 CSV、Excel 等表格式文件。