5

Linux でコマンド ラインから matlab を起動すると、奇妙な動作が発生します。

コマンドラインからmatlabで関数を実行し、次のようにC++で記述されたカスタム関数で他の操作を行うLinuxのbashスクリプトがあります。

#!/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)-release (x86_64-pc-linux-gnu)、およびmatlab2011aを使用しています。

EDITED:生成された出力prepare_data_matlab( 'A' )ここに画像の説明を入力

生成される出力prepare_data_matlab( 'B' )ここに画像の説明を入力

EDITED: whereおよびfile_nameとして作成されます。マトリックスは前後に表示されません。strcat(path_to_data,f);path_to_data = /tmp/f = data_out.txtB

次のように、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ステートメントの前に実行されます。

4

2 に答える 2

5

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

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

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

更新: @Amro の提案により、@pQB はこの問題を MathWorks サポートに報告しました。彼らの反応は次のとおりです。

この問題は、R2012a より前のバージョンの既知の問題です。別のシェルで MATLAB を実行します。たとえば、tcsh にも zsh にもこの問題はありません。

古い回答: 問題は ではなくdlmwrite、マトリックスの内容にあります。さらに、(例: )file_nameを指していない限り、関数は画面に何も書き込まず、端末を混乱させません。呼び出しの直前 (または直後) に行列 B を指しているか、表示しています。stdoutfile_name='/dev/stdout';dlmwritefile_namestdoutdlmwrite

いずれにせよ、問題は行列 B の内容にあります (出力の奇妙な文字を参照してください)。マトリックス B の問題を修正する必要があります。入力データの読み取りに使用している方法に問題がある可能性があります。

于 2013-08-02T15:49:15.877 に答える