抑制Matlab的启动消息

15
我希望能够在Bash中非交互式地调用Matlab,并在Matlab之外使用其结果。
例如,我有一个名为test.m的脚本。
rand(3,4)
quit

当我在bash中执行时

$ matlab -nosplash -nodesktop -nodisplay -r test
Warning: No window system found.  Java option 'MWT' ignored

                        < M A T L A B (R) >
              Copyright 1984-2008 The MathWorks, Inc.
                     Version 7.7.0.471 (R2008b)
                         September 17, 2008


  To get started, type one of these: helpwin, helpdesk, or demo.
  For product information, visit www.mathworks.com.


ans =

0.8147    0.9134    0.2785    0.9649
0.9058    0.6324    0.5469    0.1576
0.1270    0.0975    0.9575    0.9706

是否可能抑制Matlab的启动消息,仅显示结果而不显示"ans="。

请注意,我提出了一个普遍性问题,而不仅仅是针对这个例子。

谢谢和问候!


在Octave中,您可以使用“-q”标志。 - sffc
5个回答

12
尝试使用-logfile命令行选项:
-logfile log         - Make a copy of any output to the command window
                       in file log. This includes all crash reports.

然后你可以使用任何方式(例如sed)轻松地删除前面的几行。例如:

matlab.exe -nosplash -nodesktop -nojvm -logfile out.log -r 'rand(3,3), exit'
sed '1,5d' out.log

如果你正在运行一个脚本,需要在继续之前完成运行,请使用-wait选项:

-wait      - MATLAB is started by a separate starter program
           which normally launches MATLAB and then immediately
           quits. Using the -wait option tells the starter
           program not to quit until MATLAB has terminated.
           This option is useful when you need to process the
           the results from MATLAB in a script. The call to
           MATLAB with this option will block the script from
           continuing until the results are generated.

更多关于MATLAB启动选项的信息可以在这里找到,或者在matlab可执行文件的参考页面中查找:Windows/Unix


MATLAB启动选项的更多信息可以在此处找到:http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_env/f8-4994.html - Richie Cotton

10

你可以使用Unix命令“tail +n”来删除输出的前n行。该标题看起来有10行,因此这将剥离它。

$ matlab -nosplash -nodesktop -nodisplay -r test | tail +10
这种方法有些脆弱,因为警告信息(比如“无窗口系统”)会被过滤掉,而头文件大小也会根据产生的警告不同而变化(这些警告信息是有用的诊断信息)。另外,警告信息可能出现在标准错误流(STDERR)中而非标准输出流(STDOUT),所以你可能需要使用 "tail +9"。
更稳健的方法是修改 Matlab 脚本,使用 fopen/fprintf/fclose 将结果写入一个单独的文件。这样,来自 Matlab 的头文件、警告信息、错误信息等就能与你想要的格式化输出分离开来。为了让 "disp" 输出到这个单独的文件处理器中,你可以使用 evalc 进行捕获。outfile 可以在 -r message 中指定作为 test() 的参数,并且 $$ 环境变量(bash 进程的 PID)可以并入文件名中,以防止在多进程环境中发生冲突。
function test(ppid)
outfile = sprintf('outfile-%d.tmp', ppid);
fh = fopen(outfile, 'w');
myvar = rand(3,4);
str = evalc('disp(myvar)');
fprintf(fh, '%s', str);
fclose(fh);

要从bash中调用它,请使用以下调用形式。(这里可能会有一些语法问题; 我现在没有Unix终端进行测试。)

% matlab -nosplash -nodisplay -r "test($$)" -logfile matlab-log-$$.tmp

假设您的bash进程ID是1234。现在,您已经在outfile-1234.tmp中获得了输出,并在matlab-log-1234.tmp中获得了Matlab日志。如果您不想依赖pwd,可以将它们放入/tmp中。您可以通过单个Matlab调用创建多个输出文件,如果需要计算多个内容,则可以节省启动成本。


2
这不应该是 tail -n +10,需要加上 -n 吗? - elaRosca
1
取决于 tail 的版本。没有 -n 选项的语法是旧版本的变体,在某些地方仍然得到支持,包括我工作的 OS X。我使用它是因为我懒惰并且习惯了它。包括 -n 选项会使它更具可移植性和可读性。 - Andrew Janke

2
我建议将输出保存到文件中,然后再读取该文件。虽然这种方法稍微有些复杂,但不容易受格式改变等因素影响而变得脆弱。它可以让你更好地掌控局面。你会在网络上找到很多脚本,可以将Matlab文件转换为其他主机语言。
示例:
A = randn(3, 2);
save temp_output.mat A
# Later, read temp_output.mat in whichever language you desire.

2
为了隐藏 ans = 的显示,您可以使用 DISP 函数:
disp(rand(3,4));

为了抑制第一个警告信息,您可以尝试添加选项-nojvm来查看是否有所帮助。
为了抑制其他所有内容,您可以尝试这个解决方案,它来自MathWorks新闻组线程,解决了相同的问题。

1
-nojvm 不会压制启动消息,即 "< M A T L A B (R) > ..."。 - Tim
@Tim:那是一个打错的字。我本意是建议它可能会有助于警告消息。我会修正的。 - gnovice

1

这样调用MATLAB

matlab -nodisplay  <test.m &>matlab.output

将所有启动消息和其他显示输出转储到 matlab.output 文件中(可以命名为任何你想要的名称)。然后,如果你按照 Peter 的建议,使用 test.m 将所需结果保存到文件中,则可以实现此目的。

csvwrite('temp_output.txt',A)

或者使用其他适当的输出函数,您可以读取此文件并继续进行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接