一、结构体数组核心概念
Matlab 的结构体数组 是由多个结构体元素组成的数组,每个元素可包含多个自定义字段(如属性),数组中每个结构体通常保持相同的字段结构(便于统一处理)。结构体数组的索引从 1 开始,通过数组名(索引).字段名的方式访问 / 修改数据,适合批量存储结构化数据(比如不同路段的 NOH 运行参数、多传感器数据等)。
二、结构体数组的定义方法(附代码示例)
以下以 "存储不同路段的 NOH 辅助驾驶数据" 为例,定义包含road_type(道路类型)、speed_limit(限速)、noh_status(NOH 状态)、sensor_count(激活传感器数量)四个字段的结构体数组。
方法 1:逐个元素赋值(最基础,新手易理解)
先定义第一个结构体元素的字段,再依次扩展后续元素,字段名需保持一致(也可灵活增减,但建议统一)。
Matlab
% 方法1:逐个元素赋值定义结构体数组
% 定义第1个结构体元素(高速公路路段)
noh_road_data(1).road_type = '高速公路';
noh_road_data(1).speed_limit = 120; % 限速120km/h
noh_road_data(1).noh_status = '正常运行';
noh_road_data(1).sensor_count = 8; % 激活8个传感器
% 定义第2个结构体元素(城市快速路路段)
noh_road_data(2).road_type = '城市快速路';
noh_road_data(2).speed_limit = 80;
noh_road_data(2).noh_status = '部分功能受限'; % 如施工路段
noh_road_data(2).sensor_count = 6;
% 定义第3个结构体元素(匝道)
noh_road_data(3).road_type = '匝道';
noh_road_data(3).speed_limit = 40;
noh_road_data(3).noh_status = '正常运行';
noh_road_data(3).sensor_count = 7;
% 访问示例:打印第2个元素的NOH状态
disp('第2个路段的NOH状态:');
disp(noh_road_data(2).noh_status);
% 遍历数组,打印所有路段的道路类型和限速
disp('=== 所有路段的NOH运行基础数据 ===');
for i = 1:length(noh_road_data)
fprintf('路段%d:%s,限速%dkm/h\n', i, noh_road_data(i).road_type, noh_road_data(i).speed_limit);
end
代码解释:
noh_road_data(1).road_type:表示结构体数组noh_road_data的第 1 个元素的road_type字段;- 每新增一个索引(如
(2)、(3)),就会自动扩展数组长度; length(noh_road_data)可获取数组元素总数,适合遍历处理。
运行输出:
bash
第2个路段的NOH状态:
部分功能受限
=== 所有路段的NOH运行基础数据 ===
路段1:高速公路,限速120km/h
路段2:城市快速路,限速80km/h
路段3:匝道,限速40km/h
方法 2:预分配数组后赋值(高效推荐,适合大数据量)
如果需要创建大量元素的结构体数组,先预分配内存(避免动态扩容的性能损耗),再赋值,是 Matlab 的最佳实践。
Matlab
% 方法2:预分配结构体数组(推荐)
road_num = 3; % 预设3个路段
% 方式A:用repmat预分配(复制空结构体)
noh_road_data = repmat(struct('road_type', '', 'speed_limit', 0, 'noh_status', '', 'sensor_count', 0), road_num, 1);
% 方式B:用struct函数直接预分配(效果同上,二选一)
% noh_road_data = struct('road_type', cell(road_num,1), 'speed_limit', zeros(road_num,1), ...
% 'noh_status', cell(road_num,1), 'sensor_count', zeros(road_num,1));
% 给预分配的数组赋值
noh_road_data(1).road_type = '高速公路';
noh_road_data(1).speed_limit = 120;
noh_road_data(1).noh_status = '正常运行';
noh_road_data(1).sensor_count = 8;
noh_road_data(2).road_type = '城市快速路';
noh_road_data(2).speed_limit = 80;
noh_road_data(2).noh_status = '部分功能受限';
noh_road_data(2).sensor_count = 6;
noh_road_data(3).road_type = '匝道';
noh_road_data(3).speed_limit = 40;
noh_road_data(3).noh_status = '正常运行';
noh_road_data(3).sensor_count = 7;
% 查看数组内存占用(验证预分配效果)
disp('结构体数组的维度:');
disp(size(noh_road_data)); % 输出 [3 1],表示3行1列的数组
代码解释:
repmat(struct(...), road_num, 1):创建一个road_num×1的结构体数组,每个元素的字段初始值为默认(字符为空、数值为 0);- 预分配的核心优势:当数组元素数量很大(如 10000 个)时,比逐个动态扩容快数倍,避免 Matlab 频繁重新分配内存。
方法 3:用 struct 函数批量创建(简洁,适合字段值批量生成)
如果字段值是批量的数组 / 单元格数组,可直接用struct函数一次性创建结构体数组,无需逐个赋值。
Matlab
% 方法3:struct函数批量创建结构体数组
% 准备批量的字段值(需为同长度的数组/单元格数组)
road_type = {'高速公路', '城市快速路', '匝道'}; % 单元格数组存储字符
speed_limit = [120, 80, 40]; % 数值数组存储限速
noh_status = {'正常运行', '部分功能受限', '正常运行'};
sensor_count = [8, 6, 7];
% 批量创建结构体数组
noh_road_data = struct(...
'road_type', road_type, ...
'speed_limit', speed_limit, ...
'noh_status', noh_status, ...
'sensor_count', sensor_count ...
);
% 访问示例:提取所有路段的传感器数量
all_sensor = [noh_road_data.sensor_count]; % 合并为数值数组
disp('所有路段激活的传感器数量:');
disp(all_sensor); % 输出 [8 6 7]
代码解释:
- 每个字段对应的值需是长度相同的数组(数值数组)或单元格数组(字符 / 异构数据);
[noh_road_data.sensor_count]:Matlab 的 "逗号分隔列表" 特性,自动将所有元素的sensor_count字段合并为数值数组,简化批量数据提取。
三、关键注意事项
- 字段名规则 :字段名必须以字母开头,可包含字母、数字、下划线,区分大小写(如
Road_Type和road_type是不同字段); - 灵活字段(不推荐) :结构体数组的不同元素可拥有不同字段(如
noh_road_data(4).weather = '雨天'),但会增加数据处理复杂度,建议保持字段统一; - 嵌套结构体:结构体字段也可是另一个结构体(如存储传感器详细信息),示例:
Matlab
% 嵌套结构体示例:字段为子结构体
noh_road_data(1).sensor_detail.camera = 4; % 摄像头数量
noh_road_data(1).sensor_detail.radar = 4; % 雷达数量
disp(noh_road_data(1).sensor_detail.camera); % 输出4
总结
- 定义结构体数组的核心方法有三种:逐个赋值 (新手入门)、预分配后赋值 (高效推荐)、struct 批量创建(简洁批量);
- 访问 / 修改数据的核心语法:
数组名(索引).字段名,批量提取字段可用[数组名.字段名]; - 处理大量数据时,优先用
repmat或struct预分配内存,避免动态扩容损耗性能。