3

次のようなC++ファイルがあります。

  • matlabエンジンを起動します
  • 呼び出しmatlab_optimize()(matlabオプティマイザーの1つを内部で実行するコンパイル済みのmファイル)
  • 結果を出力します
  • エンジンを停止して終了します

これは正常に機能します。2行目を次のように変更します

  • 呼び出しmatlab_optimize(obj_fun)

obj_fun()それ自体が他のコードにコールバックする私のC++コードで定義された関数はどこにありますか。基本的に、内部で使用されるmatlabオプティマイザーでmatlab_optimize、提供された関数ポインターを目的関数として使用する必要があります。

obj_fun()matlabエンジン(すべてを駆動する)を起動するc ++プロセスと通信したいので、スタンドアロンのmexファイルとしてコンパイルすることはできません。

2009年のニュースグループの投稿は、これが不可能であることを示しているようです。次に、Matlab C ++ MathLibraryToolboxはこれを実行できるようです

グーグルで回ると、この生成されたスニペットも表示されます。

/*
 * Register a function pointer as a MATLAB-callable function.
 */
extern void mexRegisterFunction(void);

これはまさに私が望んでいることのようですが、ファイルは2000年のものであり、matlabのドキュメントにはこの関数への参照がどこにもありません。では、これをどのように使用するのですか?

4

5 に答える 5

5

mclmcrrt.hヘッダーのmclCreateSimpleFunctionHandle関数を使用して、この機能を作成できます。

プロトタイプvoid(*)(int、mxArray *、int、mxArray)を持つ関数をmxArray構造体に変換します。

これをMATLAB側の関数に渡して、mexファイルを操作せずに一般的なMATLAB関数のように呼び出すことができます。

C / C ++側:

void callback(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
{
   <some manipulations with data>;
}

...
//calling the matlab function
matlab_function(mclCreateSimpleFunctionHandle(callback));

MATLAB側:

function [] = matlab_function(function)
    function(<any variable>)
end
于 2012-12-07T07:58:41.580 に答える
2

この問題についてMathworksに連絡し、すべてを機能させることができました。この質問は、Python関数へのコールバックをMatlabに直接渡すことができるようにするための幅広い取り組みの一環でした。

このブログ投稿の詳細とgithubで入手可能なコード

于 2012-02-06T15:30:09.493 に答える
2

totoroの有益なコメントに感謝します。ここでは、C++側のより詳細な実装例を示します。

void fromMatlabCallback(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
{
  cout << "WOW I'm from Matlab. and it passes me a param: ";
  int aa = mxGetScalar(prhs[0]); // it is first param; nrhs tells how many there are
  cout << aa << "\n";
}

void InitializingFunc()
{
  mxArray *func_ptr = mclCreateSimpleFunctionHandle(fromMatlabCallback);
  mxArray *retVal_ptr = NULL;
  mlfUntitled(1, &retVal_ptr , func_ptr); //Untitled is name of my main Matlab func
}
于 2016-02-24T08:17:39.087 に答える
0

それをする方法があれば、私はそれを見たことがありません。さらに悪いことに、参照しているMatlabC++数学ライブラリはもう存在しません。

http://www.mathworks.com/matlabcentral/newsreader/view_thread/267802

于 2012-01-30T19:25:37.343 に答える
0

任意のMATLAB関数(ここを参照)からc-linkableライブラリを作成できるようです 。これが宣伝どおりに機能する場合は、別の方法でやりたいことができるはずです。

于 2012-01-31T02:39:00.740 に答える