2013-07-31 8 views
5

linuxのコマンドラインからmatlabを起動すると、異常な動作をしています。コマンドラインからmatlabを起動した後で、linux端末に何かが見つからない

私は、コマンドラインからMATLABで関数を実行するのlinuxでbashスクリプトをしましたし、次のように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端末にする必要があります。

私はprepare_data_matlab('A')でmatlabを起動するだけですが、問題は、オプションprepare_data_matlab('B')で関数を実行したときに問題なくなります。

私は行ずつコメントし、問題がprepare_data_matlab('A')で使用されていない

dlmwrite(file_name, B, ' '); 

関数を呼び出し、そのオプションBであることを見出しました。

この動作を回避するには、コマンドラインからmatlabをどのように実行すればよいですか? dlmwrite()機能の既知のバグはありますか?

Iは、Ubuntuのバージョン12.04 64ビット、GNU bashのを、使用してい4.2.24(1)(x86_64の-PC-LinuxベースのGNU)とmatlab2011aを-release。 EDITED

prepare_data_matlab('A')ために生成された出力は enter image description here

prepare_data_matlab('B')ために生成された出力であることEDITED enter image description here

ある:file_namestrcat(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関数がworkscapeからデータを選択し、次のようにディスクに保存:

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 

EDITED:玉葉-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 

さらに多くの配列がワークスペースにありますが、ロードするものがあります。

%% 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 

をし、次のコマンド:上が、引数エラーが次のようにチェックして掲載され

prepare_data_matlab機能は同じである引数のエラーチェックで後に実行される

cd /data/matlab; 

両方のケース(オプションAとオプションB)、つまりifステートメントの前。

+4

出力をファイルにリダイレクトし( '>'を使ってシェルリダイレクトする)、端末を破壊する出力がどのように生成されたのかをお知らせください。 – mnagel

+0

@mnagel質問をmatlabコマンドで生成された出力に更新しました。私は奇妙なキャラクターに気付かず、彼らが何を意味するか分からない。 – pQB

+0

####データをワークスペース#### "'のメッセージが画面に正しく表示されますか? – cabad

答えて

5

問題はdlmwriteではありません。これは、linkに報告されているように、MATLABの一部のバージョンではバグです。

提案された解決策(あなたはMATLABのバグのバージョンを持っている場合)nohupを使用することです:

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

がUPDATE: パー@Amroさんの提案、@pQBは、MathWorks社のサポートに問題を報告しました。彼らの反応は次のとおりです。

この問題は、R2012a以前のバージョンでは既知の問題です。 MATLABを別のシェルで実行します。たとえば、tcshまたはzshのどちらもこの問題を抱えていません。

OLD答え: 問題がdlmwriteではありませんが、マトリックスの内容に。さらに、file_namestdout(たとえば、file_name='/dev/stdout';)を指している場合を除き、dlmwrite関数は画面に何も書き込まず、端末を混乱させません。 file_namestdoutを指しているか、またはdlmwriteコールの直前(または後)に行列Bを表示しています。

いずれの場合でも、問題は行列Bの内容にあります(出力の奇妙な文字を参照してください)。行列Bの問題を修正する必要があります。おそらく、入力データを読み取るために使用しているメソッドに誤りがあります。

+0

データはMATLABワークスケールから読み込まれます。 'dlmwrite'呼び出しの前または後にMATLAB関数から端末に出力が書き込まれません。この情報で質問を更新しました。 – pQB

+0

私はいくつかの検索をして、これがMATLABのバグであることを発見したので、私の答えが変わった。そのように、あなたはそれを修正することはできませんが、私の新しい答えに示唆されているように回避することができます。 – cabad

+0

あなたは正しいです。あなたの提案は問題を解決しました。とても多くのエラーチェック... – pQB

1

あなたは、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によって生成されたファイルに依存する場合に問題を引き起こす可能性があります。考えられる解決方法については、hereを参照してください。

+0

出力を/ dev/nullにリダイレクトしようとしましたが、何も印刷されず、最初にバナーも印刷されませんでした。しかし、この問題は解決しません。スクリプトが終了すると、私はLinuxコンソールで何を入力したかわかりません。 – pQB

+0

MATLABから標準出力に何も印刷していないのであれば、おそらくC++プログラムが端末を破壊しているでしょうか? – Amro

+0

私はそうは思わない。 linuxのbash端末から '' matlab2011a -nodesktop -nosplash -r "prepare_data_matlab( 'B');を実行しても問題は解決しますが、prepare_data関数内の' dlmwrite'呼び出しにコメントすれば消えます。 – pQB

関連する問題