抑制Matlab的启动消息

时间:2009-10-05 02:48:01

标签: matlab command-line

我想以非交互方式在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 =”的结果。

注意我不仅仅是针对这个例子提出一般性问题。

谢谢和问候!

5 个答案:

答案 0 :(得分:11)

尝试使用 -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.

可以在herematlab可执行参考页中找到有关MATLAB启动选项的更多信息:Windows / Unix

答案 1 :(得分:9)

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

$ matlab -nosplash -nodesktop -nodisplay -r test | tail +10
但是,这有点脆弱,因为警告(如“没有窗口系统”)将被剥离,并且标题大小将根据发生的警告而变化(这些警告是有用的诊断)。此外,该警告可能是STDERR而不是STDOUT,因此“tail +9”可能就是您所需要的。

更强大的方法可能是使用fopen / fprintf / fclose修改Matlab脚本以写入单独的文件。这样,来自Matlab的标题,警告,错误等将与您想要的格式化输出分开。要使“disp”输出转到该单独的文件句柄,您可以使用evalc捕获它。可以使用-r消息中的test()参数和文件名中包含的$$ env变量(bash进程的PID)来指定outfile,以防止多进程环境中的冲突。

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 PID是1234.现在你已经输出了outfile-1234.tmp和Matlab登录matlab-log-1234.tmp。如果你不想依赖pwd,请将它们粘贴在/ tmp中。您可以扩展它以从单个matlab调用创建多个输出文件,如果您需要计算多个内容,可以节省启动成本。

答案 2 :(得分:2)

我建议将输出保存到文件中,然后读入该文件。这种方法稍微复杂一些,但随着格式的改变等而不那么脆弱。它为您提供了更多的控制。您可以在网上找到大量脚本,将Matlab文件转换为不同的主语言。

示例:

A = randn(3, 2);
save temp_output.mat A
# Later, read temp_output.mat in whichever language you desire.

答案 3 :(得分:2)

要取消显示ans =,您可以使用DISP功能:

disp(rand(3,4));

要取消第一条警告消息,您可以尝试添加-nojvm选项以查看是否有帮助。

要取消其他所有操作,您可以从解决相同问题的MathWorks新闻组线程中尝试this solution

答案 4 :(得分:1)

像这样调用MATLAB

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

会将所有启动消息和其他显示的输出转储到matlab.output文件中(可以命名为任何您想要的名称)。如果您(遵循Peter的建议)让test.m使用

将所需的结果保存到文件中
csvwrite('temp_output.txt',A)

或其他适当的输出函数,然后您可以在此文件中读取并继续。