0

Linuxで自動グレーダープログラムを書いています。MATLAB で書かれた採点者が何人かいるので、それらをまとめて、学生にプログラムを実行させて課題を出させ、課題を選択させたいと考えています。私は C++ メイン プログラムを使用しています。このプログラムには、mcc でコンパイルされた MATLAB ライブラリがリンクされています。

具体的には、私のプログラムは、さまざまな matlab プログラムの名前とその他の情報の構成ファイルを読み取ります。次に、その情報を使用して、学生に選択肢を提示します。したがって、割り当てが変更、追加、または削除された場合、構成ファイルを変更するだけで済みます。

次に、プログラムは mcc でコンパイルされた正しい matlab ライブラリを呼び出すという考え方です。ただし、これは、グレーダーが変更された場合、ライブラリを再コンパイルする必要があることを意味します。さらに悪いことに、グレーダーが追加または削除された場合、プログラム全体を再コンパイルする必要があります。したがって、グレーダーの m ファイルを直接呼び出す、単純で変更されない 1 つの matlab ライブラリ関数が必要です。私は現在、メインプログラムから渡された文字列に eval を使用するライブラリを持っています。

問題は、私がこれを行うと、どうやら、mcc がグレーダーの m コードをそれ自体に吸収することです。コンパイル後に grader m コードを変更しても効果はありません。これが起こらないことを望みます。Mathworks は、matlab を完全にバイパスする可能性があるため、これを行うことを望んでいない可能性があることに気付きました。それは私の意図ではなく、完全な matlab インストールを必要とするソリューションに満足しています。

私の考えられる解決策は、メイン プログラムに mex ファイルを使用するか、メイン プログラムに mcc ライブラリを呼び出してから、mex ファイルを呼び出し、適切なグレーダーを呼び出すことです。最初の解決策をためらう理由は、それを機能させるためにコードにどれだけの変更を加える必要があるかわからないからです。私のコードは C ではなく C++ です。ただし、2 番目の解決策は、より複雑で、最終的には同じ問題が発生する可能性があります。

それで、この状況について何か考えはありますか?どうすればいいですか?

4

3 に答える 3

2

問題を解決する最も複雑な方法を選択したようです。いくつかの代替手段を次に示します。

  1. C/C++ をまったく使用しない -- 選択肢のメニューを表示する MATLAB プログラムを作成し (MATLAB コマンド ウィンドウの単純なテキスト メニューの GUI)、適切な MATLAB グレーディング プログラムを呼び出します。

  2. メニュー プログラムは C/C++ で記述しますが、-r 引数を使用して MATLAB を呼び出し、特定のグレーディング プログラムを実行します (起動時間を短縮するには、必要に応じて -nodesktop、-nojvm、または -nodisplay オプションを使用します)。ただし、メニューを選択するたびに MATLAB が新たに起動されることに注意してください。

  3. メニュー プログラムを C/C++ で記述し、popenコマンドを使用して MATLAB を起動します (これにより、C++ プログラムと MATLAB プロセスの間にパイプが設定されます)。ユーザーによるメニュー選択後:

    • C++ プログラムは、MATLAB プログラムの名前 (および任意のパラメーター) をパイプに書き込みます。
    • MATLAB 側で、MATLAB プログラムをそのパイプのブロッキング読み取りに書き込みます。コマンドを読み取ると、適切な MATLAB 関数が呼び出されます。
    • 名前付きパイプを使用することもできます。詳細については、このMATLAB ニュースグループ スレッドを参照してください。

更新: 上記のオプション #3 は、MATLAB エンジンが効果的に機能する方法であるため、おそらくそれを直接使用する方がよいでしょう。

于 2010-03-15T15:59:35.993 に答える
0

これを mex 関数にしないでください。

matlab で実行する必要がある通常の m ファイルを使用します。最初に matlab を起動したくない場合は、bat ファイルを作成します。-r または -m は特定のコマンドを実行すると思います (ml 関数を実行する前に、正しいディレクトリに移動する必要があります)。

mex を使用して C++ コードをコンパイルするには、最初に Visual Studio をインストールします。次に、(matlab で) mex -setup を実行します。「インストールされているコンパイラを見つける」などを選択し、リストからコンパイラを選択します。これで、mex は C++ コードをコンパイルします。

于 2010-03-14T18:05:10.343 に答える