------ cell 与 struct 的用法详解
本文是 Octave 基础教程系列的第 3 篇,介绍两种灵活的数据类型:cell(元胞) 和 struct(结构体)。它们是组织复杂数据、处理异构信息的利器,语法和 MATLAB 基本一致。
✅ 一、什么是 Cell(元胞数组)?
在 Octave 中,普通数组只能存储一种类型的元素(如全是数值或全是字符)。而 cell 数组 可以存储不同类型的数据,比如:
-
一个 cell 元素是字符串
-
另一个是数值
-
另一个是矩阵
就像"容器中的容器"。
🔹 1. 创建 Cell
C = {123, 'Octave', [1 2 3]};
现在:
-
C{1}
是数值 123 -
C{2}
是字符串'Octave'
-
C{3}
是一个数组[1 2 3]
🔹 2. 访问 Cell 元素
访问方式 | 含义 | 示例 |
---|---|---|
C{1} |
解引用(内容) | 得到 123 |
C(1) |
cell 本体(仍是 cell) | 得到 {123} |
a = C{2}; % a = 'Octave' b = C(2); % b 仍然是一个 1×1 cell
🔹 3. 修改 Cell 内容
C{1} = 999; C{4} = "new item"; % 添加新元素(双引号也是字符串)
🔹 4. 常见用法示例:混合数据表
row1 = {'Tom', 18, 88.5}; row2 = {'Lucy', 20, 92.0}; table = {row1; row2}; disp(table{2, 3}); % 输出第2行第3列:92.0
✅ 二、什么是 Struct(结构体)?
结构体 是一种以字段(field)方式组织数据的容器。适合表示带属性的对象,例如:学生、员工、实验结果等。
🔹 1. 创建结构体
student.name = 'Alice'; student.age = 21; student.score = 95.5;
🔹 2. 访问字段
student.name % 输出 'Alice' student.age % 输出 21
🔹 3. 修改字段
student.score = 100; % 改分数 student.major = 'Physics'; % 添加新字段
🔹 4. 结构体数组
s(1).name = 'Tom'; s(1).score = 90; s(2).name = 'Jerry'; s(2).score = 88; disp(s(2).name); % 输出 Jerry
结构体数组可用于组织一组对象。
📌 Cell vs Struct 对比表
特性 | Cell 元胞 | Struct 结构体 |
---|---|---|
是否支持混合类型 | ✅ 是 | ✅ 是 |
是否有字段名 | ❌ 否 | ✅ 有 |
访问方式 | 数字索引 {} |
点号字段名 . |
是否支持数组 | ✅ 支持多行列 | ✅ 支持结构体数组 |
🔍 小技巧
-
isstruct(x)
检查是否是结构体 -
iscell(x)
检查是否是 cell -
fieldnames(s)
获取结构体字段名 -
numel(C)
获取 cell 元素数量
🧪 实用示例:用 struct + cell 存表格数据
octave
CopyEdit
data(1).name = '张三'; data(1).scores = {90, 88, 95}; % 三门成绩 data(2).name = '李四'; data(2).scores = {85, 92, 89}; disp(data(2).scores{2}); % 输出 李四 的第二门成绩:92
🧾 总结
类型 | 特点 | 应用场景 |
---|---|---|
cell |
存储混合类型内容、矩阵、字符串等 | 表格行列数据、灵活容器 |
struct |
用字段组织数据,有语义 | 对象、记录、配置、JSON风格数据 |
掌握 cell
和 struct
后,你可以处理各种灵活数据格式,包括 JSON、数据表、实验数据等。