2012-04-09 5 views
1

私は、fMRI脳画像データの計算集中的な操作を実現する数千行のMATLABコードを持っています。多くの操作は複数の並列スレッドで実行できますが、異なるスレッド/ワーカーのすべてのfprintfdisp出力が同じウィンドウに表示されるという問題があります。別のウィンドウに別のparforワーカー/スレッドのfprintfとdisp出力をリダイレクトする

Linux環境でunixコマンドを使用して新しいMATLABインスタンスを作成するカスタムマルチスレッドコードを作成しました。ですから、私は最初に.mファイルPreprocessSubj1.m、PreprocessSubj2.m、PreprocessSubj3.m、PreprocessSubj4.mを書き出します。これらのファイルには同じ計算が含まれていますが、異なる科目には含まれています。これらの4つのMATLAB関数は完全に独立しています。

CellArrayOfFunctions = { 'PreprocessSubj1', 'PreprocessSubj2', ... 
'PreprocessSubj3', 'PreprocessSubj4' }; 

CellArrayOfFunctions_i = 1; 

while (CellArrayOfFunctions_i <= size(CellArrayOfFunctions, 2)) 
    FunctionToBeRun = CellArrayOfFunctions{CellArrayOfFunctions_i}; 
    unix([ 'matlab -desktop -r ', FunctionToBeRun, ' &' ]); 
    CellArrayOfFunctions_i = CellArrayOfFunctions_i + 1; 
end 

私はMATLABスレッドをフォークするためにunixを使用することは、非常にその場しのぎだと思います。メンテナンス性とメモリ使用量を改善するために、parforを使用してこのコードを実装したいと思います。しかし、異なるスレッド/ワーカーの出力を別のウィンドウにリダイレクトする方法はありますか?

ありがとうございました:)

+0

私はMatlabについて何も知らないけど、あなたのprintfステートメントの前にスレッドIDを付けてログに書き込む方法はありませんか?次にログをテールし、出力をgrepに渡してスレッドIDを検索します。興味のあるスレッドごとに別の端末でこれを行います。単なる考えです。 – Duck

+0

私は既に各スレッドの個別のログを作成していますが、それは自分のコードでのみ動作し、使用しているMATLABツールボックス(SPM8)のfprintfステートメントでは動作しません。しかし、MATLAB組み込みfprintfを自分自身のfprintf.mに置き換え、MATLAB組み込みdispと "tail -f $ logfilename.txt"で端子をオープンする場合は、これが私の問題の解決策になります。 – nrz

答えて

2

あなたはおそらくの/ dev/PTS /#、#はウィンドウを表しますに書き込みたいです。あなたがが何とか/後の/ dev/PTSを置くためにどの番号を決定する必要があります

output1 = fopen('/dev/pts/0', 'w'); 
output2 = fopen('/dev/pts/1', 'w'); 
fwrite(output1, 'Data to window 1'); 
fwrite(output2, 'Data to window 2'); 

:あなたがこれを行うことができます。新しい端末を開くたびに、その端末に対応する新しいファイルが表示されるので、利用可能な端末は!ls /dev/ptsで確認できます。

+0

これは可能な解決策またはその一部である可能性があります。ありがとうございました。 – nrz