3

C で開発されたソフトウェアから呼び出したいと思いMATLABます。標準構文を使用したシステム コールを使用して、MATLAB を呼び出す方法を知っています。

matlab -nojvm

私の問題は、新しいセッションを開くのに多くの時間を費やすたびにMATLAB(要求された処理が終了するとMATLAB閉じるため、新しいデータが処理できるようになったら再実行する必要があることです)。

MATLAB セッションを常に開いたままにする (そして "サーバー" として使用する) 方法はありますか? また、新しいデータが処理可能であることを "通知" する方法はありますか? これにより、MATLAB の新しいセッションを毎回実行するという、本当に時間がかかる苦痛を回避できます。

4

2 に答える 2

0

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 で動作するとしても驚かないでしょう。

于 2013-10-28T02:09:13.897 に答える
0

Mathworks は、ドキュメント センターで、C、C++、および Fortran から Matlab を呼び出す方法に関するドキュメントとサンプル コードを提供しています。Matlab 変数を設定し、任意の文字列を渡して、他の変数から結果を読み取ることができるようです。

stdin本当に Matlab のandに書き込みたい場合はstdout、おそらく最もクリーンな方法は次のとおりです。

  1. (2) を 2 回呼び出しpipeて、パイプの読み取り/書き込みペアを作成し、Matlab の stdin と stdout に接続します。
  2. (2) を呼び出しforkて、新しい子プロセスを作成します。
  3. 子プロセスでは、dup(2) を 使用して
    1. 1 つのパイプの読み取り側をファイル記述子 0 ( stdin) にコピーし、
    2. もう一方のパイプの書き込み側をファイル記述子 1 ( stdout) にコピーします。
  4. 子にexecve(2) を呼び出して Matlab を呼び出すようにする

親は、最初のパイプにコマンドを書き込むことができるようになり、それらは Matlab に送信されます。flushパイプを開いて書き込む方法によっては、各コマンドの後に呼び出す必要がある場合があります。Matlab の に接続された 2 番目のパイプは、Matlabstdoutからのテキスト出力をキャプチャします。

Matlab が に何かを送信するかどうかはわかりませんstderr。その場合、それをキャプチャしたい場合は、stderr(ファイル記述子 2) に関連付けられた 3 番目のパイプを作成します。それ以外の場合は、元のプログラムの に移動します。stderrこれは、必要なものである場合とそうでない場合があります。

私は Matlab の C/C++ インターフェイスを使用したことはありませんが、Matlab の出力を解析するよりもおそらく使用する方が簡単だと思います。

于 2013-10-28T02:26:36.863 に答える