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