2009-10-05 5 views
14

Я хочу вызвать матлаб в bash неинтерактивно и использовать его результат вне Matlab.подавить начальное сообщение Matlab

К примеру, у меня есть сценарий test.m

rand(3,4) 
quit 

Когда я исполняю в Баш

$ 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

В Octave вы можете использовать флаг '-q'. – sffc

ответ

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. Исходный файл можно указать с помощью аргумента test() в сообщении -r и переменной $$ env (PID процесса bash), включенной в имя файла, чтобы предотвратить конфликты в многопроцессорной среде.

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 

Допустим, ваш Баш ПИД 1234. Теперь у вас есть свой выход в Outfile-1234. tmp и журнал Matlab в matlab-log-1234.tmp. Вставьте их в/tmp, если вы не хотите, чтобы они зависели от pwd. Вы можете расширить это, чтобы создать несколько выходных файлов из одного вызова matlab, сохраняя затраты на запуск, если вам нужно вычислить несколько вещей.

+2

Если это не 'tail -n + 10', с' -n'? – elaRosca

+1

Зависит от версии 'tail'. Синтаксис без '-n' является более старым вариантом и по-прежнему поддерживается в некоторых местах, включая OS X, где я работаю. Я использую его, потому что я ленив и привык к нему. Включение '-n' сделает его более портативным и, вероятно, более читаемым. –

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 в посмотрите, поможет ли это.

Чтобы подавить все остальное, вы можете попробовать this solution из потока новостей MathWorks, который касается той же проблемы.

+1

-nojvm не подавляет сообщение о запуске, то есть « ...» – Tim

+0

@Tim: Это было ошибкой. Я хотел предположить, что это может помочь с предупреждением. Я исправлю это. – gnovice

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:

-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 варианты можно найти here или в справочных страницах matlab: Windows/Unix

+0

Подробнее о вариантах запуска MATLAB можно найти здесь: http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_env/f8-4994.html –

Смежные вопросы