Simulink中如何使用结构体数组或元胞矩阵存储可变多面体参数
Simulink可变尺寸多面体参数调用可行方案
下面是三种经过验证的实现技巧,可绕开Simulink对结构体数组、元胞矩阵的直接使用限制,且比补零对齐的空间利用率更高:
方案1:MATLAB Function调用工作区元胞(无需代码生成场景优先)
Simulink的MATLAB Function模块内部支持直接访问MATLAB基础工作区的元胞数组,无需把参数放到信号线中传输:
- 先在MATLAB基础工作区把所有多面体参数存入两个元胞数组
cell_A、cell_b,元胞索引对应多面体的编号 - 在MATLAB Function开头声明外部调用权限,按索引直接取参数即可,示例代码如下:
function [A,b] = get_poly_param(idx) coder.extrinsic('evalin') % 从基础工作区读取元胞数组 cell_A = evalin('base','cell_A'); cell_b = evalin('base','cell_b'); % 按索引取对应参数 A = cell_A{idx}; b = cell_b{idx};
- 该方案实现成本最低,不需要修改参数存储结构,适合纯仿真不需要生成嵌入式代码的场景。
方案2:参数序列化+自定义解码(支持代码生成场景优先)
该方案完全兼容代码生成,空间利用率远高于补零对齐,适合多面体尺寸差异大的场景:
- 预处理阶段把所有A矩阵、b向量的元素按顺序拼接成1维的序列化参数向量,同时生成一张参数信息表,每个多面体对应表中一行,存储:A的行数、A的列数、b的长度、A元素在序列化向量中的起始位置、b元素在序列化向量中的起始位置
- MATLAB端预处理示例代码:
poly_num = 600; info_table = zeros(poly_num,5); serial_data = []; for i = 1:poly_num A = 你的第i个多面体A矩阵; b = 你的第i个多面体b向量; [r,c] = size(A); lb = length(b); % 记录当前多面体的参数信息 info_table(i,:) = [r,c,lb, length(serial_data)+1, length(serial_data)+r*c+1]; % 把A、b元素序列化后加入大向量 serial_data = [serial_data; A(:); b(:)]; end
- 把
serial_data、info_table作为常量导入Simulink,在MATLAB Function中做解码:输入多面体索引,先查信息表拿到参数起止位置,从序列化向量中切出对应元素后reshape成目标尺寸的A、b即可。
方案3:自定义Bus数组(多面体切换场景适用)
如果需要在仿真过程中动态切换不同多面体参数,可使用Simulink.Bus定义自定义数据类型:
- 先创建一个Bus类型,包含两个可变大小数组元素
A、b,提前指定好A、b的最大尺寸上限 - 把所有多面体参数转为该Bus类型的数组,存在Data Store Memory中,需要调用时按索引读取对应Bus元素即可
- 该方案适合需要频繁切换多面体参数的场景,2020a及以上版本Simulink均支持可变大小元素的Bus数组。
内容的提问来源于stack exchange,提问作者seedship
相关产品推荐
相关产品推荐

