Подтвердить что ты не робот

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

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

Например, у меня есть script 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 =".

Примечание. Я задаю общий вопрос не только для этого примера.

Спасибо и приветствую!

4b9b3361

Ответ 1

Вы можете использовать команду Unix "tail + n" для удаления первых n строк вывода. Этот заголовок выглядит как 10 строк, поэтому это разделит его.

$ matlab -nosplash -nodesktop -nodisplay -r test | tail +10

Это немного хрупко, потому что предупреждения (например, "без оконной системы" ) будут разделены, а размер заголовка будет зависеть от того, какие предупреждения происходят (и эти предупреждения являются полезной диагностикой). Кроме того, это предупреждение может быть на STDERR вместо STDOUT, поэтому "tail +9" может быть тем, что вам нужно.

Более надежным подходом может быть изменение Matlab script для записи в отдельный файл с помощью fopen/fprintf/fclose. Таким образом, заголовок, предупреждения, ошибки и т.д. Из Matlab будут отделены от отформатированного вывода, который вы хотите. Чтобы получить вывод "disp", чтобы перейти к этому отдельному дескриптору файла, вы можете записать его с помощью evalc. Исходный файл можно указать с помощью аргумента test() в сообщении -r, а переменная $$ env ( 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 в matlab-log-1234.tmp. Вставьте их в /tmp, если вы не хотите, чтобы они зависели от pwd. Вы можете расширить это, чтобы создать несколько выходных файлов из одного вызова matlab, сохраняя затраты на запуск, если вам нужно вычислить несколько вещей.

Ответ 2

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

Также, если вы работаете с script, где вам нужно, чтобы завершить работу перед продолжением, используйте параметр -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

Ответ 3

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

Пример:

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

Ответ 4

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

disp(rand(3,4));

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

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

Ответ 5

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

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

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

csvwrite('temp_output.txt',A)

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