我有一个Simulink模型,在开始之前,执行一个脚本(在回调中)(让我们调用脚本constants.m
)在基础工作区中设置各种常量和参数。现在,我希望Simulink模型能够使用各种常量和参数(即具有多个文件,constants1.m
,constants2.m
等)执行。这将消除手动更改相同脚本的需要每次运行Simulink模型之前。
我能够设置一个脚本(batchProcessing.m
),可以多次加载,执行和关闭模型。但是,我想让所有作业同时在各种内核上运行(我有一个12核的Xeon CPU)。没有Parallel Toolbox可以做到这一点吗?是否可以使用批处理脚本(.bat
)?
更新
这是我在macduff回答的帮助下尝试的:
我的测试功能:
function test3(n, ii)
A = rand(n);
B = rand(n);
tic; C=A*B;
tableTitle = {'Resultat'};
fileID = fopen(strcat('D:\Documents\MATLAB', '\', 'batchResults', num2str(ii), '.txt'),'w');
fprintf(fileID, '%12s\n', tableTitle{1});
fprintf(fileID, '%12.5f\n',C(1:10));
fclose(fileID);
toc
end
.bat文件:
set MATLAB_EXE_PATH = "C:\MATLAB\R2010a\bin\matlab.exe"
start /MIN /LOW "MATLAB" "%MATLAB_EXE_PATH%" -nosplash -nodesktop -r "test3('%100%','%1');"
start /MIN /LOW "MATLAB" "%MATLAB_EXE_PATH%" -nosplash -nodesktop -r "test3('%100%','%2');"
没有任何反应,并且未创建.txt。如果我直接在Matlab中运行test3函数,它可以正常工作。所以问题在于批处理文件。
使用正确答案进行更新
再次,在macduff回答的帮助下,我在这里做了什么:
set MATLAB_EXE_PATH=C:\MATLAB\R2010a\bin\matlab.exe
set arg1=5000
set arg2=1
start /MIN /LOW %MATLAB_EXE_PATH% -nodesktop -nosplash -r "cd('D:\Documents\MATLAB\'); test3(%arg1%,%arg2%); exit;"
set arg2=2
start /MIN /LOW %MATLAB_EXE_PATH% -nodesktop -nosplash -r "cd('D:\Documents\MATLAB\'); test3(%arg1%,%arg2%); exit;"
现在,如果Matlab窗口可以保持关闭而不在屏幕上弹出,那将会很棒。
答案 0 :(得分:2)
这需要经常出现,需要在没有Parallel Toolbox的情况下运行多个Matlab会话。这确实是可能的。我相信你建议的方法很有可能,而且可能是最简单的方法,尽管有很多方法可以解决这个问题。
set MATLAB_EXE_PATH = "C:\MATLAB\2009b\win32\matlab.exe"
start /MIN /LOW "MATLAB" "%MATLAB_EXE_PATH%" -nosplash -nodesktop -r "functionIWantToRun('%stringArgumentsToThisFunction%',...)"
您可以使用不同参数重复上面的start
命令进行初始函数调用,以进行批处理作业。
修改的
猜猜我不是很清楚,抱歉。以下是批处理文件的示例:
rem In a file like, runMe.bat on the Desktop that you double click
set MATLAB_EXE_PATH = "C:\MATLAB\2009b\win32\matlab.exe"
start /MIN /LOW "MATLAB" "%MATLAB_EXE_PATH%" -nosplash -nodesktop -r "functionIWantToRun('%stringArgumentsToThisFunction%',...)"
start /MIN /LOW "MATLAB" "%MATLAB_EXE_PATH%" -nosplash -nodesktop -r "functionIWantToRun('%differentStringArgumentsToThisFunction%',...)"
我从来不需要指定运行Matlab的核心。根据我的经验,当一个新的进程假脱机时,它被分配到每个核心,所以我总是运行尽可能多的进程,就像我有核心一样。这非常有效,但如果您需要更精细的谷物控制,您应该考虑dbenham关于PSEXEC等的建议。 HTH!
修改的
您需要将脚本放在启动目录中,即Matlab启动的目录see this link。我尝试了下面这个,就像一个快速和脏的检查,我在C:\ Data中有test3.m。
set V=100
set K=2
start "MATLAB" /LOW /MAX "MATLAB" -nosplash -nodesktop -r "chdir('C:\Data'); test3(%V%,%K%);"
有效!但我没有调出MATLAB版本,仅使用PATH。
这是我的最后一次发售。 : - )
m文件:
function test3(n, ii)
A = rand(n);
B = rand(n);
tic; C=A*B;
tableTitle = {'Resultat'};
fileID = fopen(strcat('C:\', 'batchResults', num2str(ii), '.txt'),'w');
fprintf(fileID, '%12s\n', tableTitle{1});
fprintf(fileID, '%12.5f\n',C(1:10));
fclose(fileID);
toc
exit;
end
Bat文件:
set MATLAB_EXE_PATH=C:\MATLAB\R2009bSP1\bin\win32\matlab.exe
start /MIN /LOW "MATLAB" "%MATLAB_EXE_PATH%" -nosplash -nodesktop -r "test3('100','1');"
start /MIN /LOW "MATLAB" "%MATLAB_EXE_PATH%" -nosplash -nodesktop -r "test3('100','2');"
set V=100
set K=2
start "MATLAB" /LOW /MAX "MATLAB" -nosplash -nodesktop -r "chdir('C:\Data'); test3(%V%,%K%);"
set V=100
set K=3
start "MATLAB" /LOW /MAX "MATLAB" -nosplash -nodesktop -r "chdir('C:\Data'); test3(%V%,%K%);"
示例输出:
Resultat 26.90660 25.58899 23.75740 23.83745 23.75160 27.37161 23.52786 28.48510 27.30217 22.07751
享受!
答案 1 :(得分:1)
您可以简单地编写一个使用多个START命令的主批处理脚本,每个所需的进程一个。操作系统应自动平衡处理器的使用。
或者,如果您想确保给定流程针对特定处理器,请下载并使用Microsoft的PSEXEC
如果你有比运行处理器更多的进程,并且你想并行运行它们,但是在运行下一个进程之前等待处理器空闲,那么看看我对Parallel execution of shell processes 的回答
答案 2 :(得分:0)
是的,可以使用Parallel Computing Toolbox,参见Videos & examples,“使用Simulink进行并行计算”部分。您必须小心,但是如何为每个模型实例设置数据,以便每个模型都可用。