подавить начальное сообщение Matlab - PullRequest
14 голосов
/ 05 октября 2009

Я хочу вызывать matlab в bash неинтерактивно и использовать его результат вне 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 ]

11 голосов
/ 05 октября 2009

Попробуйте использовать параметр командной строки -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

9 голосов
/ 05 октября 2009

Вы можете использовать команду 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

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

2 голосов
/ 05 октября 2009

Чтобы подавить отображение ans =, вы можете использовать функцию DISP :

disp(rand(3,4));

Чтобы отключить это первое предупреждающее сообщение, вы можете попробовать добавить опцию -nojvm, чтобы посмотреть, поможет ли это.

Чтобы подавить все остальное, вы можете попробовать это решение из потока группы новостей MathWorks, который решает ту же проблему.

2 голосов
/ 05 октября 2009

Я бы порекомендовал сохранить вывод в файл, а затем прочитать в этом файле. Этот подход немного сложнее, но менее хрупок по мере изменения форматов и т. Д. Он дает вам гораздо больше контроля. В Интернете вы найдете множество скриптов для преобразования файлов Matlab на другой язык хоста.

Пример:

A = randn(3, 2);
save temp_output.mat A
# Later, read temp_output.mat in whichever language you desire.
1 голос
/ 05 октября 2009

Вызов MATLAB, как это

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

сбросит все сообщения запуска и другие отображаемые данные в файл matlab.output (который может быть назван как угодно). Если у вас (по совету Питера) есть test.m, сохраните результат, который вам нужен, в файл, используя

csvwrite('temp_output.txt',A)

или другую подходящую функцию вывода, которую вы можете прочитать в этом файле и продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...