Подавить начальное сообщение Matlab

Я хочу вызывать 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 ответов

Решение

Вы можете использовать команду 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, экономя затраты на запуск, если вам нужно вычислить несколько вещей.

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

Пример:

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

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

disp(rand(3,4));

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

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

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

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

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

csvwrite('temp_output.txt',A)

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

Другие вопросы по тегам