You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:48:05