Что-то пропало в терминале linux после запуска matlab из командной строки

У меня странное поведение при запуске Matlab из командной строки в Linux.

У меня есть скрипт bash в Linux, который выполняет функцию в Matlab из командной строки и выполняет другие операции с пользовательскими функциями, написанными на C++, следующим образом:

#!/bin/bash
# prepare input data just to be sure it has not been written by other test!
matlab2011a -nodesktop -nosplash -r "prepare_data_matlab( 'A' ); quit"
# launch C++ program
...
# prepare more data
matlab2011a -nodesktop -nosplash -r "prepare_data_matlab( 'B' ); quit"

Когда скрипт закончен, я не вижу, что я пишу в терминале, хотя команды имеют эффекты. Мне необходимо reset терминал.

Дело в том, что все работает нормально, если я только запускаю Matlab с prepare_data_matlab( 'A' ) но проблема возникает, когда я выполняю функцию с опцией prepare_data_matlab( 'B' ),

Я прокомментировал построчно и обнаружил, что проблема с опцией B которые вызывают функцию

dlmwrite(file_name, B, ' ');

который не используется в prepare_data_matlab( 'A' ),

Итак, как мне выполнить Matlab из командной строки, чтобы избежать этого поведения? Есть ли известная ошибка с dlmwrite() функционировать?

Я использую Ubuntu 12.04 64 бит, GNU bash, версия 4.2.24(1)-релиз (x86_64-pc-linux-gnu) и matlab2011a.

РЕДАКТИРОВАНИЕ: вывод, созданный для prepare_data_matlab( 'A' ) является

Выходные данные, созданные для prepare_data_matlab( 'B' ) является

Редакция: file_name создан как strcat(path_to_data,f); где path_to_data = /tmp/ а также f = data_out.txt, матрица B не отображается до или после.

Единственный вывод в терминал до или после сценария MATLAB генерируется из сценария bash следующим образом:

echo "#### SELECT DATA FROM WORKSPACE ####"
matlab2011a -nodesktop -nosplash -r "prepare_data_matlab( 'B' ); quit";
echo "#### Process Data as input in a C++ programs ####"

Функция MATLAB выбирает данные из рабочей среды и сохраняет их на диск следующим образом:

function [ ] = prepare_data_matlab( type )
if strcmp(type,'A')
    % load data from workscape
    load ('workspace_with_my_arrays.mat', 'A');    
    % save data as a standalone variable
    save('/tmp/A.mat', 'A');
elseif strcmp(type,'B')
    % load data from workscape
    load ('workspace_with_my_arrays.mat', 'B');    
    path_to_data = '/tmp/';
    f            = 'data_out.txt';
    file_name    = strcat(path_to_data,f);
    % save data as a txt file
    dlmwrite(file_name, B, ' ');
end
end

РЕДАКТИРОВАНИЕ: whos -file workspace_with_my_arrays.mat

Name                             Size                     Bytes  Class     Attributes

A                             610x340x103            170897600  double              
B                             610x340x103            170897600  double
P                             610x340                  1659200  double              
t1                            38855x100                 31084000  double              
t2                            3921x2x100                6273600  double

В рабочей области больше массивов, но я загружаю их.

prepare_data_matlab Функция такая же, как опубликованная выше, но с проверкой ошибок аргумента следующим образом:

%% Load data from file 
% Data is saved in a MATLAB variable or in TXT 
if nargin ~= 1
    error('Use: prepare_data_matlab( [ A | B ] )')
end

и следующая команда:

cd /data/matlab;

который выполняется после проверки ошибок аргументов в обоих случаях (опция Aи вариант B), то есть до if заявление.

2 ответа

Решение

Проблема не с dlmwrite, Это, как представляется, ошибка в некоторых версиях MATLAB, как сообщается в этой ссылке.

Предлагаемое решение (если у вас глючная версия MATLAB) заключается в использовании nohup:

nohup matlab -nodesktop -nosplash -r ...........

ОБНОВЛЕНИЕ: Согласно предложению @Amro, @pQB сообщил о проблеме в службу поддержки MathWorks. Их ответ был:

Эта проблема известна в версиях до R2012a. Запустите MATLAB под другой оболочкой. Например, ни tcsh, ни zsh не имеют этой проблемы.

СТАРЫЙ ответ: проблема не с dlmwrite, но с содержанием вашей матрицы. Кроме того, если file_name указывает на stdout (например, file_name='/dev/stdout';), dlmwrite Функция не будет ничего записывать на экран и не будет портить ваш терминал. Или file_name указывает на stdout или вы отображаете матрицу B непосредственно перед (или после) dlmwrite вызов.

В любом случае проблема заключается в содержимом вашей матрицы B (см. Странные символы в выходных данных). Вам нужно исправить проблему с вашей матрицей B. Возможно, метод, который вы используете для чтения входных данных, неисправен.

Если вы хотите игнорировать вывод из MATLAB (например, баннер, напечатанный в начале), запустите процесс и перенаправьте стандартный ввод и ошибку на /dev/null устройство:

#!/bin/sh

echo '### running MATLAB ###'
matlab -nodesktop -nosplash -r "..." > /dev/null 2>&1
echo '### done ###'

./other_script.sh

matlab -nodesktop -nosplash -r "..." > /dev/null 2>&1

Обратите внимание, что вы должны быть осторожны, поскольку процесс MATLAB возвращается немедленно, возможно, до его завершения, что может вызвать проблемы, если ваша следующая программа зависит от файлов, созданных MATLAB. Смотрите здесь для возможного решения.

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