结构体 #
一、结构体概述 #
结构体(struct)是一种将不同类型数据组合在一起的数据类型,使用字段名(field)来访问数据:
matlab
% 创建结构体
student.name = '张三';
student.age = 20;
student.scores = [85 90 78];
% 查看结构体
student
% student =
% name: '张三'
% age: 20
% scores: [85 90 78]
二、创建结构体 #
2.1 直接赋值 #
matlab
% 逐字段赋值
person.name = '李四';
person.age = 25;
person.city = '北京';
% 添加新字段
person.email = 'lisi@example.com';
2.2 struct函数 #
matlab
% 使用struct函数创建
student = struct('name', '王五', ...
'age', 22, ...
'major', '计算机');
% 创建空结构体
empty_struct = struct();
% 创建带空字段的结构体
s = struct('a', {}, 'b', {});
2.3 结构体数组 #
matlab
% 创建结构体数组
students(1).name = '张三';
students(1).age = 20;
students(2).name = '李四';
students(2).age = 22;
% 使用struct创建
students = struct('name', {'张三', '李四'}, ...
'age', {20, 22});
三、访问结构体 #
3.1 访问字段 #
matlab
student.name = '张三';
student.age = 20;
student.scores = [85 90 78];
% 点号访问
name = student.name; % '张三'
age = student.age; % 20
scores = student.scores; % [85 90 78]
% 动态字段名
field = 'name';
value = student.(field); % '张三'
3.2 访问结构体数组 #
matlab
% 创建结构体数组
students(1).name = '张三';
students(1).age = 20;
students(2).name = '李四';
students(2).age = 22;
students(3).name = '王五';
students(3).age = 21;
% 访问单个元素
name1 = students(1).name; % '张三'
% 访问所有元素的某字段
names = {students.name}; % {'张三', '李四', '王五'}
ages = [students.age]; % [20 22 21]
3.3 嵌套结构体 #
matlab
% 嵌套结构体
university.name = '清华大学';
university.location.city = '北京';
university.location.province = '北京';
university.students.undergrad = 15000;
university.students.graduate = 20000;
% 访问嵌套字段
city = university.location.city; % '北京'
grad_count = university.students.graduate; % 20000
四、结构体操作 #
4.1 添加字段 #
matlab
student.name = '张三';
% 直接添加
student.age = 20;
student.scores = [85 90 78];
% 使用setfield
student = setfield(student, 'email', 'zhangsan@example.com');
4.2 删除字段 #
matlab
student.name = '张三';
student.age = 20;
student.temp = '临时数据';
% 删除单个字段
student = rmfield(student, 'temp');
% 删除多个字段
student = rmfield(student, {'age', 'email'});
% 保留指定字段
student = keepfield(student, {'name', 'scores'});
4.3 修改字段 #
matlab
student.name = '张三';
student.age = 20;
% 直接修改
student.age = 21;
% 使用setfield
student = setfield(student, 'name', '李四');
4.4 重命名字段 #
matlab
student.name = '张三';
student.age = 20;
% 使用struct重命名
student = struct('姓名', student.name, '年龄', student.age);
% 或手动处理
new_student.姓名 = student.name;
new_student.年龄 = student.age;
student = new_student;
五、结构体函数 #
5.1 字段操作函数 #
matlab
student.name = '张三';
student.age = 20;
student.scores = [85 90 78];
% 获取所有字段名
fields = fieldnames(student);
% {'name'; 'age'; 'scores'}
% 检查字段是否存在
has_name = isfield(student, 'name'); % true
has_email = isfield(student, 'email'); % false
% 获取字段值
age = getfield(student, 'age'); % 20
5.2 结构体信息 #
matlab
% 判断是否为结构体
isstruct(student) % true
% 结构体数组大小
students(1).name = '张三';
students(2).name = '李四';
size(students) % [1, 2]
% 字段数量
n = numel(fieldnames(student)); % 3
5.3 结构体与表转换 #
matlab
% 结构体数组转表
students(1).name = '张三';
students(1).age = 20;
students(2).name = '李四';
students(2).age = 22;
T = struct2table(students);
% name age
% ____ ___
% '张三' 20
% '李四' 22
% 表转结构体数组
S = table2struct(T);
5.4 结构体与元胞数组转换 #
matlab
student.name = '张三';
student.age = 20;
% 结构体转元胞数组
c = struct2cell(student);
% {'张三'; 20}
% 元胞数组转结构体
fields = {'name', 'age'};
values = {'李四', 22};
s = cell2struct(values, fields, 2);
六、结构体数组操作 #
6.1 创建结构体数组 #
matlab
% 方法1:逐个赋值
students(1).name = '张三';
students(1).age = 20;
students(2).name = '李四';
students(2).age = 22;
% 方法2:使用struct
students = struct('name', {'张三', '李四', '王五'}, ...
'age', {20, 22, 21});
% 方法3:使用repmat
student = struct('name', '默认', 'age', 0);
students = repmat(student, 3, 1);
6.2 操作结构体数组 #
matlab
students(1).name = '张三';
students(1).scores = [85 90];
students(2).name = '李四';
students(2).scores = [78 88];
students(3).name = '王五';
students(3).scores = [92 95];
% 提取所有name
names = {students.name}; % {'张三', '李四', '王五'}
% 提取所有scores
all_scores = cat(1, students.scores);
% [85 90; 78 88; 92 95]
% 计算平均分
avg_scores = mean(all_scores, 2);
6.3 筛选结构体数组 #
matlab
students(1).name = '张三';
students(1).age = 20;
students(2).name = '李四';
students(2).age = 22;
students(3).name = '王五';
students(3).age = 21;
% 筛选年龄大于20的学生
ages = [students.age];
mask = ages > 20;
older_students = students(mask);
七、实用示例 #
7.1 学生信息管理 #
matlab
% 创建学生结构体
function student = createStudent(name, age, scores)
student.name = name;
student.age = age;
student.scores = scores;
student.average = mean(scores);
student.grade = getGrade(student.average);
end
function g = getGrade(avg)
if avg >= 90
g = 'A';
elseif avg >= 80
g = 'B';
elseif avg >= 70
g = 'C';
elseif avg >= 60
g = 'D';
else
g = 'F';
end
end
% 使用
student1 = createStudent('张三', 20, [85 90 78]);
student2 = createStudent('李四', 22, [92 88 95]);
7.2 配置管理 #
matlab
% 创建配置结构体
config.database.host = 'localhost';
config.database.port = 3306;
config.database.name = 'mydb';
config.database.user = 'root';
config.logging.level = 'INFO';
config.logging.file = 'app.log';
config.app.name = 'MyApp';
config.app.version = '1.0.0';
% 使用配置
function conn = connect(config)
fprintf('连接到 %s:%d/%s\n', ...
config.database.host, ...
config.database.port, ...
config.database.name);
end
7.3 实验数据存储 #
matlab
% 存储实验结果
experiment.name = '温度测试';
experiment.date = '2024-03-27';
experiment.parameters.temperature = [25 50 75 100];
experiment.parameters.pressure = 1.0;
experiment.results.measurements = rand(4, 10);
experiment.results.mean = mean(experiment.results.measurements, 2);
experiment.results.std = std(experiment.results.measurements, 0, 2);
% 保存到文件
save('experiment.mat', 'experiment');
八、结构体与类对比 #
8.1 选择建议 #
| 特性 | 结构体 | 类 |
|---|---|---|
| 简单数据存储 | ✓ 推荐 | 复杂 |
| 方法封装 | ✗ 不支持 | ✓ 支持 |
| 访问控制 | ✗ 无 | ✓ 有 |
| 继承 | ✗ 无 | ✓ 支持 |
| 灵活性 | ✓ 高 | 中等 |
8.2 示例对比 #
matlab
% 使用结构体
student.name = '张三';
student.age = 20;
student.scores = [85 90];
student.average = mean(student.scores);
% 使用类(更复杂但更规范)
classdef Student
properties
name
age
scores
end
methods
function obj = Student(name, age, scores)
obj.name = name;
obj.age = age;
obj.scores = scores;
end
function avg = getAverage(obj)
avg = mean(obj.scores);
end
end
end
九、最佳实践 #
9.1 字段命名规范 #
matlab
% 推荐:使用小写和下划线
student.student_name = '张三';
student.student_id = '001';
% 不推荐:使用驼峰或特殊字符
student.studentName = '张三'; % 可行但不推荐
9.2 结构体数组预分配 #
matlab
% 不推荐:动态扩展
for i = 1:1000
data(i).value = rand();
end
% 推荐:预分配
data = struct('value', cell(1, 1000));
for i = 1:1000
data(i).value = rand();
end
9.3 使用动态字段名 #
matlab
% 动态访问字段
fields = {'name', 'age', 'scores'};
student.name = '张三';
student.age = 20;
student.scores = [85 90];
for i = 1:length(fields)
field = fields{i};
fprintf('%s: ', field);
disp(student.(field));
end
十、总结 #
本章学习了:
- 创建结构体:直接赋值、struct函数
- 访问字段:点号访问、动态字段名
- 结构体操作:添加、删除、修改字段
- 结构体函数:fieldnames、isfield、rmfield
- 结构体数组:创建和操作
- 嵌套结构体:多层结构
- 类型转换:与表、元胞数组互转
下一章将学习MATLAB的元胞数组类型。
最后更新:2026-03-27