5

cmd毎回 Matlab の新しいインスタンスを開かずに、特に Windows (Linux ターミナル、LUA スクリプトなど) によって外部から Matlab 関数を呼び出す方法はありますか?

たとえばcmd

matlab -sd myCurrentDirectory -r "function(parameters)" -nodesktop -nosplash -nojvm

Matlab の新しいインスタンスを比較的高速に開き、関数を実行します。この削減された matlab プロンプトの開閉には (計算なしで) 約 2 秒かかります。したがって、4000 回の実行では 2 時間以上かかります。呼び出された関数は常に同じワークスペースにあるため、これを避けたいと思います。常に同じインスタンスで実行できますか?

私はすでにいくつかの調査を行い、MATLAB COM Automation Serverの可能性を発見しましたが、それは非常に複雑に思え、私のケースで機能させるための重要な手順がわかりません。そのためのアドバイスはありますか?

詳しいわけではありませんが(ただし最悪の場合)c/c++/c#の使用を考えています。python

4

4 に答える 4

3

@Ilya Kobelevskiy の機能しないがよく考えられたアイデアに基づいて、最終的な回避策を示します。

 function pipeConnection(numIterations,inputFile)

 for i=1:numIterations

 while(exist('inputfile','file'))

     load inputfile;
     % read inputfile -> inputdata
     output = myFunction(inputdata);

     delete('inputfile');
 end

 % Write output to file
 % Call external application to process output data
 % generate new inputfile 

 end;

別の便利な解決策は、Matlab 関数の実行可能ファイルをコンパイルすることです。

mcc -m myfunction

次を使用してこの.exeファイルを実行しcmdます。

cd myCurrentDirectory && myfunction.exe parameter1 parameter2

パラメータは文字列として渡されるようになり、元の.m-file はそれを考慮して調整する必要があることに注意してください。

さらなる備考:

  • 実行する必要はありませんが、Matlab をシステムにインストールする必要があると思います。
  • このメソッドが、基になる関数の複雑さによってそれぞれどの程度制限されているかはわかりません。
  • 質問で指定された初期アプローチと比較したスピードアップは比較的小さい
于 2013-09-13T17:25:17.873 に答える
1

ここで紹介するいくつかの方法の中には、複数の matlab 呼び出しの実行時間を短縮する回避策が 1 つあります。アイデアは、matlab セッション内でカスタム関数を複数回実行することです。

たとえば、myRand.m関数は次のように定義されます。

function r = myRand(a,b)
r = a + (b-a).*rand;

matlab コマンド ウィンドウ内で、次のような 1 行のコマンドを生成します。

S = [1:5; 1:5; 101:105];
cmd_str = sprintf('B(%d) = myRand(%d,%d);', S)

B(1) = myRand(1,101);B(2) = myRand(2,102);B(3) = myRand(3,103);B(4) = myRand(4,104);B(5) = myRand(5,105);単一の matlab セッション内で実行される次のコマンド文字列を生成します。

matlab -nojvm -nodesktop -nosplash -r "copy_the_command_string_here";

制限の 1 つは、4000 回の関数呼び出しを連続して実行する必要があることです。

于 2013-09-13T11:04:20.790 に答える
1

私は Magla によって提案されたアプローチが好きですが、コメントに記載されている制約を考えると、1 つの matlab セッションで単一の関数を実行するように改善できます。

アイデアは、入力と出力をパイプすることです。入力については、特定の入力ファイルが存在するかどうかを確認できます。存在する場合は、そこから関数の入力を読み取り、作業を行い、出力を別のファイルに書き込んで、スクリプト/関数の処理結果に、matlab 関数が実行されて待機していることを通知できます。次の入力。

ディスク ファイルを使用して実装するのは非常に簡単です。多少の努力をすれば、おそらくメモリ ディスクを介して実行できます (つまり、RAM で入力/出力フィールドを開く)。

function pipeConnection(numIterations,inputFile,outputFile)

for i=1:numIterations

while(!isfile(inputFile))
sleep(50);
end;

% Read inputs

output = YourFunction(x,y,z);

% Write output to file, go to next iteration

end;
return;

開始時に反復回数が不明な場合は、すぐに反復回数を指定するのではなく、入力ファイルに終了条件をエンコードすることもできます。

于 2013-09-13T21:16:37.397 に答える
1

説明した方法でオプションを使用してコマンドラインからMATLABを起動している-r場合、説明したように常に新しいインスタンスが開始されます。これを回避する方法はないと思います。

C/C++ アプリケーションから MATLAB を呼び出す場合、MATLAB は、 MATLABの実行中のインスタンスに接続するMATLAB エンジンインターフェイスを提供します。

それ以外の場合は、言及した MATLAB Automation Server インターフェイスが正しい方法です。複雑だと感じている場合は、試したことと問題を詳しく説明した別の質問を投稿することをお勧めします。

完全を期すために、MATLAB には Java から直接呼び出すことができるドキュメント化されていない インターフェイスもあることに言及します。


編集: R2014b の時点で、MATLAB は Python 用の MATLAB エンジンを利用できるようにします。これにより、Python スクリプトから MATLAB を自動化できます。R2016b の時点では、Java 用の MATLAB エンジンもあります。上記の文書化されていない Java 手法を以前に検討していた人がいる場合は、これが最適な方法です。

于 2013-09-13T08:56:53.797 に答える