Skip to content

MATLAB - 结构体

在 MATLAB 中,结构体(structure)是一种数据类型,它使用命名容器(称为字段(fields))对相关数据进行分组。每个字段可以保存任何类型的数据,例如数字、字符串、矩阵,甚至另一个结构体。这使得结构体非常适合组织复杂、异构的数据,例如患者记录或实验参数。

**结构体数组(structure array)**是一种数组,其中每个元素都是相同格式的结构体(即,具有相同的字段名)。这对于管理类似项目的集合非常有用,例如学生列表或产品目录。

你可以通过两种主要方式创建结构体:使用点表示法(dot notation)或 struct 函数。

点表示法是创建单个结构体或向现有结构体添加字段的最直观方式。你只需使用语法 structName.fieldName = value; 为字段赋值。

% 创建一个结构体来存储一个学生的信息
student.name = 'John Doe';
student.id = 12345;
student.courses = {'Calculus', 'Physics', 'History'};
student.grades = [85, 92, 78];
% 显示创建的结构体
disp(student);

当你执行此代码时,MATLAB 会显示结构体及其内容:

struct with fields:
name: 'John Doe'
id: 12345
courses: {'Calculus', 'Physics', 'History'}
grades: [85 92 78]

struct 函数非常适合从现有单元数组或矩阵创建结构体数组。它对于预分配结构体数组尤其高效。

s = struct(field1, value1, field2, value2, ...)

这里,fieldN 是字符向量(例如,'Name'),而 valueN 通常是一个单元数组,其中包含该字段在结构体数组所有元素中的值。

% 在单元数组中定义数据
names = {'Riya', 'Tiya', 'Siya'};
ids = {101, 102, 103};
majors = {'Engineering', 'Arts', 'Science'};
% 创建一个 1x3 结构体数组
students = struct('Name', names, 'ID', ids, 'Major', majors);
% 访问第二个学生的数据
riyas_major = students(1).Major;
disp(riyas_major)
% 显示整个结构体数组
disp(students);

输出:

Engineering
1x3 struct array with fields:
Name
ID
Major

你可以检查单个元素,例如 students(2),以查看其内容:

students(2)
ans =
struct with fields:
Name: 'Tiya'
ID: 102
Major: 'Arts'

MATLAB 提供了多个函数来管理和检查结构体。

函数描述
fieldnames(S)返回一个包含结构体 S 中字段名称的单元字符串数组。
isfield(S, fieldName)检查 fieldName(字符串)是否是结构体 S 中的字段。返回逻辑 true (1) 或 false (0)。
isstruct(A)确定变量 A 是否为 MATLAB 结构体。返回 true 或 false。
rmfield(S, fieldName)从结构体 S 中移除指定字段 fieldName 并返回修改后的结构体。
% 重用上一个示例中的 'students' 结构体数组
names = {'Riya', 'Tiya', 'Siya'};
ids = {101, 102, 103};
majors = {'Engineering', 'Arts', 'Science'};
students = struct('Name', names, 'ID', ids, 'Major', majors);
% 1. 获取所有字段名
f_names = fieldnames(students);
disp('Field names:');
disp(f_names);
% 2. 检查 'ID' 是否为字段(应为 true)
has_id = isfield(students, 'ID');
disp(['Does struct have ''ID'' field? ', num2str(has_id)]);
% 3. 检查 'GPA' 是否为字段(应为 false)
has_gpa = isfield(students, 'GPA');
disp(['Does struct have ''GPA'' field? ', num2str(has_gpa)]);
% 4. 检查 'students' 是否为结构体
is_a_struct = isstruct(students);
disp(['Is the variable a struct? ', num2str(is_a_struct)]);
% 5. 移除 'Major' 字段
students_modified = rmfield(students, 'Major');
disp('Structure after removing ''Major'' field:');
disp(students_modified);

输出:

Field names:
'Name'
'ID'
'Major'
Does struct have 'ID' field? 1
Does struct have 'GPA' field? 0
Is the variable a struct? 1
Structure after removing 'Major' field:
1x3 struct array with fields:
Name
ID

对于处理表格数据(其中每行是一个观测值,每列是一个变量),MATLAB 的 table(表)数据类型通常是比结构体数组更强大、更方便的替代方案。表提供了基于列的操作、元数据支持以及与统计和绘图函数的无缝集成。当你的数据适合类似电子表格的格式时,请考虑使用 table。