【问题标题】:Run multiple MATLAB instances concurrently through a batch file通过批处理文件同时运行多个 MATLAB 实例
【发布时间】:2023-08-04 00:40:01
【问题描述】:

有没有办法通过批处理文件在不同的 MATLAB 实例中同时运行多个 .m 文件?我要完成的任务如下:

  1. 打开 x 个 MATLAB 实例;

  2. 让不同的实例同时运行不同的 .m 文件(这样我的 CPU 能力就可以完全利用);

  3. 所有实例完成后,退出所有 MATLAB。

单个批处理文件可以完成这个过程吗?我想使用单个批处理文件的原因是我想在我的 MATLAB 脚本中调用这个批处理文件。本质上,我想做并行计算。 (由于我的一些脚本必须在没有并行计算工具箱的 MATLAB 2007 上运行,我必须想办法解决。)

由于我对命令提示符知之甚少,请解释一下代码的语法。

目前,我只知道如何按顺序完成任务,就像下面显示的代码。

cd "C:\My_MATLAB_folder_path"

matlab r- "mfile01;exit"

matlab r- "mfile02;exit"

...

matlab r- "mfilexx;exit"

如果命令提示符无法实现此过程,我可以使用哪些替代方法?重要的一点是,无论使用什么方法,都必须能够在 MATLAB 脚本中调用。

【问题讨论】:

  • 当 CMD 从批处理文件执行命令或程序时,它会等待启动的程序退出,然后执行下一个命令。为了克服这个问题,您可以在每次调用 MATLAB 之前加上 start 命令:start "" matlab r- "mfilexx;exit"。这只是从批处理脚本的角度来看,但我既不推荐也不拒绝同时调用太多 MATLAB 实例的想法。但必须有一个你应该考虑的限制。在 MATLAB 调用之间稍微延迟可能是个好主意timeout <SecondsToWait>
  • @sst 您可以使用并行计算工具箱在 MATLAB 中本地实现此目的。这样做时,工作实例的默认数量等于机器上的核心数量,这可能有助于指导使用此方法的实例数量。
  • @Wolfie,是的,我也是这么想的。这说得通。感谢您的信息。
  • @sst 谢谢,那行得通。另一个请求:您能否将您的评论放在答案中,以便我可以选择您的作为最佳答案然后关闭问题?

标签: matlab batch-file


【解决方案1】:

当 CMD 从批处理文件执行命令或程序时,它会等待启动的程序退出,然后执行下一个命令。为了克服这个问题,您可以在每次调用 MATLAB 之前加上 start 命令:start "" matlab r- "mfilexx;exit"

在 MATLAB 调用之间稍微延迟可能是防止硬盘承受过大压力的好主意。

所以这个任务可以用这样的方式完成:

@echo off
setlocal

REM Delay is in seconds after /t switch
set "delay=timeout /t 1 /nobreak >nul"
REM Or this for Windows XP: (Delay is in milliseconds after -w switch)
set "delay=ping -n 1 -w 1000 127.255.255.255 >nul"

cd /d "C:\My_MATLAB_folder_path"

start "" matlab -r "this.m;exit"
%delay%

start "" matlab -r "that.m;exit"
%delay%
...

或者,也可以通过这种方式使用批处理脚本来简化:

cd /d "C:\My_MATLAB_folder_path"
for %%A in (
    "this.m"
    "that.m"
    "other.m"
    "add each file in a new line or on the same line separated with space.m" "one another.m"
) do (
    start "" matlab -r "%%~A;exit"
    %delay%
)

【讨论】:

  • 首先,感谢您的回答。我还有一个问题:是否可以在任何打开的 MATLAB 运行时“保留”批处理文件?在我的 MATLAB 脚本中,这些 .m 文件的输出用作以下脚本的输入。因此,在 MATLAB 继续之前,所有 .m 文件都应该完成。我尝试为最后打开的 .m 文件添加 /wait,希望它也能在最后完成。但是,并非所有时间最后打开的都是最后完成的,这会导致我的 MATLAB 脚本出现错误,因为输入不足。我该如何解决这个问题?
  • @SiyuJiang,我不确定我是否理解正确。我假设您想同时执行一组 MATLAB 脚本并等待它们全部完成,然后再执行另一组 MATLAB 脚本。如果是这种情况,请查看此Answer。但是,您不能直接将来自该答案的代码用于您自己的目的,但是您可以将所使用的技术合并到您自己的代码中。无论哪种方式,如果您有任何新问题,都应该提出另一个问题。
  • 对不起,我试图理解你给我的答案但失败了。对于我这样的初学者来说太高级了。但是,我在 link 找到了一个更简单的解决方案。不过还是谢谢你。
  • @SiyuJiang,很高兴你找到了一个可行的解决方案。是的,您发布的链接中的解决方案更简单,也更有效。但基本概念是相同的。
最近更新 更多