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

如何将含初始化脚本的Matlab/Simulink串行工作流转为并行计算?

问题

我的Simulink模型依赖多个结构体(如struct1、struct2)作为模块Mask的输入,原有串行工作流如下:

  • 修改输入参数param1、param2等
  • 执行初始化主脚本(会调用多个子例程),生成更新后的结构体存入工作区
  • 运行模型
  • 更换参数值,重复上述流程

尝试过用parfor结合set_param分配结构体字段到Mask,再用parsim运行,但无法在set_param前成功执行初始化脚本;直接用parsim也失败了,想知道怎么把这个串行流程改成并行方案。


可行的并行化方案

方案1:用parsim配合独立参数初始化函数

核心是把参数初始化+结构体生成封装成独立函数,让每个并行Worker单独完成初始化,避免工作区变量冲突:

  1. 封装初始化逻辑:把修改参数、执行主脚本的逻辑写成函数,输入为param1、param2,输出为生成的结构体:
function [struct1, struct2] = initParams(param1, param2)
    % 写入原初始化主脚本的代码,包括调用子例程
    run('main_init_script.m'); % 若主脚本需保留,直接调用
    % 返回生成的结构体
end
  1. 准备参数组合列表:把所有要测试的param1、param2组合成数组:
paramsList = {{1, 10}, {2, 20}, {3, 30}}; % 每个元素对应一组参数
  1. 配置仿真输入实例:用Simulink.SimulationInput对象,给每个实例单独执行初始化并绑定结构体:
modelName = 'YourModel';
simInList = cell(size(paramsList));

for i = 1:length(paramsList)
    simIn = Simulink.SimulationInput(modelName);
    % 当前Worker独立执行初始化,得到结构体
    [struct1, struct2] = initParams(paramsList{i}{1}, paramsList{i}{2});
    % 将结构体字段赋值给Mask参数(假设Mask参数名对应字段)
    simIn = setParameter(simIn, 'MaskParam1', 'struct1.field1');
    simIn = setParameter(simIn, 'MaskParam2', 'struct2.field2');
    % 也可直接将整个结构体传入模型工作区
    simIn = setVariable(simIn, 'struct1', struct1);
    simIn = setVariable(simIn, 'struct2', struct2);
    simInList{i} = simIn;
end
  1. 启动并行仿真:
results = parsim(simInList, 'ShowProgress', 'on');

方案2:parfor结合独立仿真工作区

若更习惯用parfor,可让每个循环迭代创建独立仿真工作区:

  1. 复用方案1中的initParams初始化函数
  2. 在parfor循环内单独处理参数组合:
modelName = 'YourModel';
paramsList = {{1, 10}, {2, 20}, {3, 30}};
results = cell(size(paramsList));

parfor i = 1:length(paramsList)
    % 每个Worker独立初始化参数
    [struct1, struct2] = initParams(paramsList{i}{1}, paramsList{i}{2});
    % 创建临时工作区并导入结构体
    tempWorkspace = struct('struct1', struct1, 'struct2', struct2);
    % 指定工作区运行仿真
    simOut = sim(modelName, 'Workspace', tempWorkspace);
    results{i} = simOut;
end

关键注意事项

  • 初始化脚本/函数不能依赖主工作区的全局变量,所有输入必须通过函数参数传递,避免并行Worker间的变量冲突
  • 若模型Mask直接引用结构体字段,确保setParameter使用的表达式在Worker工作区内有效(如直接用结构体变量名+字段)
  • 可提前用parpool手动启动并行池,避免parsim/parfor启动时的延迟

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:25:05