重定向fprintf并将不同parfor worker / threads的disp输出重定向到单独的窗口

时间:2012-04-09 15:12:09

标签: linux multithreading matlab unix printf

我有数千行MATLAB代码,可以实现对fMRI脑成像数据的不同计算密集型操作。许多操作可以在多个并行线程中运行,但问题是不同线程/工作程序的所有fprintfdisp输出都打印在同一窗口中。

我编写了一个自定义多线程代码,在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

我认为使用unix分支MATLAB线程是一个很大的问题。我想使用parfor实现此代码,以获得更好的可维护性和更小的内存使用率。但有什么方法可以将fprintf(和disp)不同线程/工作者的输出重定向到单独的窗口?

谢谢:)

1 个答案:

答案 0 :(得分:2)

您可能想要写入/ 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');

您需要确定在/ dev / pts /之后放置哪些数字。每次打开新终端时,都会出现与该终端对应的新文件,因此您可以使用!ls /dev/pts检查可用的终端。