MATLAB にはinput
をリッスンする関数がありますstdin
。アップストリームの C プログラムが、ディスクに書き込んでフラッシュしたデータのチャンクのファイル名を入力するのを待つ次のスクリプトを考えてみましょう。
while true()
% wait for upstream process to enter filename
filename = input('', 's');
% quit means we're done
if strcmp(filename, 'quit')
quit()
end
% run secondary processing as instructed
process_chunk(filename);
end
C プログラムは、単純にデータ ファイルの名前を に書き込むことができますstdout
。最後のチャンクが書き込まれた後、MATLAB スクリプトに終了を伝えることさえできますquit
。本質的に、C プログラムは次のようになります。
for (int n = 0; n < N_CHUNK; n ++)
{
// generate a filename for this chunk
char filename[32];
sprintf(filename, "chunk%d.txt", n);
// do the actual work, generating a data file
write_chunk(n, filename);
// tell MATLAB to process that file
printf("%s\n", filename);
}
// tell MATLAB we're done
printf("quit\n");
両方を連携させるには、C プログラムで MATLAB プロセスに「入力」する必要があります。C プログラムに名前が付けられfoo
ていて、スクリプトが にbar.m
ある場合、次のようにそれらを連結します。
$ foo | matlab -nojvm -nodisplay -r bar
input
これを MATLAB R2013a (8.1.0.604) でテストしたばかりですが、長い間聴いていたstdin
としても、Linux 上のほぼすべてのバージョンの MATLAB で動作するとしても驚かないでしょう。