2009-10-05 67 views
14

我想在bash中非交互地调用matlab,并在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 =”。

注意我不只是为这个例子提出一个普遍问题。

感谢和问候!

+0

在八度你可以使用'-q'标志。 – sffc 2015-09-15 20:45:21

回答

9

您可以使用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消息中的test()参数以及文件名中包含的$$ env变量(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的PID为1234。现在你已经得到了在OUTFILE-1234的输出。 tmp和matlab-log-1234.tmp中的Matlab日志。如果你不想依赖pwd,请将它们放在/ tmp中。您可以扩展它以从单个matlab调用创建多个输出文件,如果需要计算多个事物,则可节省启动成本。

+2

这不是'tail -n + 10',是否带'-n'? – elaRosca 2013-11-09 17:46:03

+1

取决于“tail”的版本。没有'-n'的语法是旧的变体,并且在某些地方仍然支持,包括我工作的OS X。我使用它,因为我很懒,习惯了。包括'-n'会使它更具可移植性,可能更具可读性。 – 2013-11-09 21:26:05

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新闻组线程中尝试this solution以解决相同的问题。

+1

-nojvm不禁止启动消息,即“ ...” – Tim 2009-10-05 03:17:49

+0

@Tim:这是一个错误类型。我的意思是建议它可能有助于警告信息。我会解决这个问题。 – gnovice 2009-10-05 03:23:30

1

调用MATLAB这样

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

将转储启动消息和其它显示输出到matlab.output文件(可以被命名为任何你想要的)的。如果再(以下彼得的建议)有test.m保存您使用

csvwrite('temp_output.txt',A) 

或其他合适的输出功能,那么您可以在这个文件中读取并继续需要一个文件的结果。

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选项:在MATLAB启动

-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可执行文件参考页:Windows/Unix

+0

关于MATLAB启动选项的更多信息可以在这里找到:http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_env/f8-4994.html – 2009-10-05 12:06:49