1

バックグラウンド

MATLAB で次の単純な関数をコンパイルするとします。

function foo(path_to_m_file)
  disp([' Running ' path_to_m_file])
  run(path_to_m_file);
end

この関数は、 .mfooファイルへのパスを取得し、それを実行しようとします。

ただし、実際fooにコンパイルして実行しようとすると、次のようになります。

./run_foo.sh $path_to_run_time $path_to_m_file

ここpath_to_m_fileで、次のようなステートメントを含む単純な.mファイルです。

a = 2;

次のエラーが表示されます。

Error using ==> run
MATLAB:run:FileNotFound

ただし、それが正しいパスをfoo取得することはわかっています。たとえば、行を次の2行に置き換えてみるとrunfoo

fID = fopen(conf_file, 'rt');
first_line = textscan(fID, '%s', Inf, 'Delimiter', '\n');

fooファイルの対応する行を読み取り.mます。したがって、.mファイルはそこにあり、MATLAB エンジンはそれを「見る」ことができます。eval実際、 で読み取った文字列でも実行できtextscanます。

だから私の質問は:

  1. 上記のエラーが表示されるのはなぜですか? ファイルをfoo実行しないのはなぜですか?.m

    更新:この質問に対する回答と思われるものについては、以下の @strictlyrude27 の回答を参照してください。

  2. 上記がうまくいかない場合。元の関数をコンパイルした後に変更された可能性のある.mファイルを実行するために MATLAB でコンパイルされた関数を取得する方法はありますか?

私の2番目の質問の動機:

.mプロジェクト全体を再コンパイルすることなく、プロジェクトの一部であるファイルを「更新」できるようにしたいと考えています。これについてのアイデアは大歓迎です。

4

2 に答える 2

4

MATLAB Compiler のドキュメントから:

コンパイルされたアプリケーションが実行時に MATLAB ファイルを処理しない

MATLAB Compiler は、ロックダウンされた機能を展開できるように設計されています。配布可能な MATLAB ファイルは、MATLAB Compiler が暗号化する時点で一時停止または凍結され、それ以降は変更されません。これは、柔軟なアプリケーションを展開できないという意味ではなく、柔軟性を念頭に置いてアプリケーションを設計する必要があることを意味します。たとえば、エンド ユーザーが 2 つの異なる方法から選択できるようにする場合は、両方をコンパイルする必要があります。

MCR は、コンポーネントのビルド時に暗号化された MATLAB コードでのみ機能します。新しい MATLAB コードを動的に生成する関数またはプロセスは、MCR に対して機能しません。

Neural Network Toolbox™ 製品などの一部の MATLAB ツールボックスは、MATLAB コードを動的に生成します。MCR は暗号化された MATLAB ファイルのみを実行し、Neural Network Toolbox は暗号化されていない MATLAB ファイルを生成するため、Neural Network Toolbox の一部の関数は配布できません。

同様に、MATLAB 関数ファイルの内容を調べる必要がある関数は配布できません。HELPたとえば、 は動的であり、展開モードでは使用できません。LOADLIBRARYMATLAB 関数プロトタイプを提供すると、展開モードで使用できます。

MATLAB コードを生成する関数をコンパイルして展開する代わりに、次のタスクを実行します。

  1. コードを MATLAB で 1 回実行して、生成された関数を取得します。

  2. 生成された関数を含めて、MATLAB Compiler で MATLAB コードをコンパイルします。

ヒントEVAL:またはを使用する別の方法として、FEVAL無名関数ハンドルを使用する方法があります。動的ランタイム処理用の MATLAB コードを作成する機能が必要な場合、エンド ユーザーは MATLAB のコピーをインストールする必要があります。

于 2011-09-13T23:43:58.647 に答える