Matlab: 从命令行运行 m 文件

假设如此;

我有一份 M 档案:
C:\M1\M2\M3\mfile.m

Matlab 的 exe 文件在这个位置:
C:\E1\E2\E3\matlab.exe

我想用 Matlab 从命令行运行这个 m 文件,例如在。蝙蝠档案。我该怎么做,有办法吗?

212674 次浏览

以下是步骤:

  1. 启动命令行。
  2. 使用 cd C:\M1\M2\M3输入包含. m 文件的文件夹
  3. 运行以下命令: C:\E1\E2\E3\matlab.exe -r mfile

Windows 系统将使用您的 current folder作为 MATLAB 搜索的位置。M 文件,并且 -r选项尝试启动给定的。M 文件,一旦启动发生。

这样的命令可以成功地运行 m 文件:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m'); exit;"

我认为在前面的答案中没有提到的一个重要问题是,如果没有明确指出,matlab 解释器仍然是开放的。 Therefore, to the answer of @hkBattousai I will add the exit command:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m');exit;"

下面是我将使用的代替方法,以便优雅地处理脚本中的错误:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "try, run('C:\<a long path here>\mfile.m'), catch, exit, end, exit"

如果你想要更多的冗长:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "try, run('C:\<a long path here>\mfile.m'), catch me, fprintf('%s / %s\n',me.identifier,me.message), end, exit"

我找到了原始参考 here。由于原来的链接现在已经没有了,这里有一个至今仍然存在的新读者的链接:

在 Linux 上,你可以做同样的事情,你可以向 shell 发送一个自定义的错误代码,如下所示:

#!/bin/bash
matlab -nodisplay -nojvm -nosplash -nodesktop -r \
"try, run('/foo/bar/my_script.m'), catch, exit(1), end, exit(0);"
echo "matlab exit code: $?"

如果脚本抛出异常,则打印 matlab exit code: 1,否则打印 matlab exit code: 0

多亏了麦芽,你的 comment帮了我。 但是我想添加 try-catch 块,因为我找到了返回整个错误消息并将其打印到 matlab 控制台的 MExeption方法 getReport()

此外,我还打印了文件名,因为这个编译是调用 matlab 的批处理脚本的一部分。

try
some_code
...
catch message
display(['ERROR in file: ' message.stack.file])
display(['ERROR: ' getReport(message)])
end;

对于传递给遗留代码生成方法的虚假模型名称,输出如下:

ERROR in file: C:\..\..\..
ERROR: Undefined function or variable 'modelname'.


Error in sub-m-file (line 63)
legacy_code( 'slblock_generate', specs, modelname);


Error in m-file (line 11)
sub-m-file


Error in run (line 63)
evalin('caller', [script ';']);

最后,要在命令提示符窗口显示输出,只需将 matlab 控制台记录到一个包含 -logfile logfile.txt(另外使用 -wait)的文件中,然后调用批处理命令 type logfile.txt

cat 1.m | matlab -nodesktop -nosplash

我用的是 Ubuntu

因为所有的答案都没有关于提供输入参数的信息,所以重要的是 经过一番研究,我发现了这个链接

输入参数非常类似于我们如何运行 Matlab 函数。

matlab -r 'try myfunction(argument1,argument2); catch; end; quit'

如果您以某种方式从 bash/Terminal 获得一个参数,您只需将其插入 bash 命令,如下所示:

matlab -r 'try myfunction($MY_BASH_ARG,argument2); catch; end; quit'

(这是经过几次反复试验后得出的结论)

自 R2019b 以来,有一个新的命令行选项 -batch。它取代了不再推荐的 -r。它还统一了跨平台的语法。参见例如 the documentation for Windows,对于其他平台的描述是相同的。

matlab -batch "statement to run"

This starts MATLAB without the desktop or splash screen, logs all output to stdout and stderr, exits automatically when the statement completes, and provides an exit code reporting success or error.

因此,不再需要在运行代码时使用 try/catch,也不再需要添加 exit语句。

我在 bash 脚本中运行这个命令,特别是为了提交 SGE 作业和批处理内容:

/Path_to_matlab -nodisplay -nosplash -nodesktop < m_file.m