1

大規模なデータ処理を必要とする Matlab プロジェクトに取り組んでおり、コードの一部を Matlab 関数よりも高速に実行する必要があります。この目的のために、ワークスペースから変数を渡す他のスクリプト内で .exe を呼び出す必要があります。それをどのように解決できるかを理解するために、小さな追加プログラムを作成しました。

次のコードがあります

function test(a,b)
if ischar(a)
  a2=str2num(a);
else
  a2=a;
end
if ischar(b)
  b2=str2num(b);
else
  b2=b;
end
res=a2+b2;
disp(res)

実行可能にするために展開ツールを使用しました。!test.exe 5 3 を使用して matlab で test.exe を実行すると動作します。2 つの変数 a=5 と b=3 を作成して !test.exe ab を試しても動作しません。

変数を .txt または .dat ファイルに渡し、プログラムを閉じて再度開くことができることは知っていますが (使用する必要がある変数は動的です)、mfile を実行するよりも効率的だとは思いませんワークスペースから変数をロードしています。

varargin、narginなどの使用についても検索しましたが、これらのコマンドにはCのargc []、argv []が使用されていません。そのようなもので問題を解決できます。

次に、mex ファイルを検索して、次のコードを記述します。

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
   mxArray *mexGetVariable(const char *workspace, const char *varname);

   const mxArray *mex_a;
   const mxArray *mex_b;

   //http://www.mathworks.com/help/techdoc/apiref/mexgetvariable.html
   if ((mex_a = mexGetVariable("a", "global"))==NULL)
   {
        mexErrMsgTxt("Variable 'a' not in workspace.");
   }
   else if ((mex_b = mexGetVariable("b", "global"))==NULL)
   {
        mexErrMsgTxt("Variable 'b' not in workspace.");
   }
   else
   {
        mexEvalString("!test.exe mex_a mex_b"); 
   }
} 

(変数 a=5 b=3 も渡しました)しかし、変数 a がワークスペースにないというプロンプトが表示されたため、何も機能しませんでした。

.txt または .dat ファイルを開かずに、matlab ワークスペースから変数を読み取る .exe プログラムを作成する方法について、コード ソリューションを提供してくれる人はいますか?

私のトピックを読んでいただき、ありがとうございます。

4

1 に答える 1

1

コマンドは、およびの値ではなく、文字列および!test.exe a bに対して実行しようとしています。これは、コマンド ラインから実行したか、mex ファイルを介して実行したかに関係なく当てはまります。test.exe'a''b'ab

次のようなことをすると:

>> a=5; b=3;
>> cmdstr = sprintf('!test.exe %f %f',a,b)
cmdstr =
!test.exe 5.000000 3.000000
>> eval(cmdstr)

それはあなたが意図していると私が思う方法でそれを呼び出すでしょう。

実際の .exe (test.exe ではない) は、MATLAB Compiler を使用して MATLAB から作成されていますか? もしそうなら、上記はまだあなたが探しているものを達成しないかもしれません. MATLAB Compiler を使用して作成された実行可能ファイルは、ライブ MATLAB と同じ速度で実行されます。

于 2012-06-19T16:22:24.967 に答える