3

私は次の問題に 1 週​​間を費やしましたが、私の人生でそれを理解することはできません! コードをできるだけ簡潔にし、無関係な行を切り捨てますが、私の問題については明確にする必要があります。手始めに、Mex ファイルを介して通信する C と組み合わせて Matlab を使用しています。難しい話は抜きにして...

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
  static double *U
  plhs[4] = mxCreateNumericArray(2,dims,mxDOUBLE_CLASS,mxREAL);
  U  = (double*)mxGetPr(plhs[4]);

  /* C code which solves for "U" based on a number of other input variables*/
  solve(U,...,...,...)

  /* C code which solves for "U" based on a number of other input variables*/
  derivative(U,...,...,...)
}

実行後、すべてが正常に機能し、「U」の導関数の値が得られました。次に、ソルバーを比較したかったので、「mexCallMATLAB」を介して呼び出すMatlab関数の「solve(U)」を交換しています。ここで迷ってしまいます

(ここでも、無関係な変数を削除しました)

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
  static double *U
  plhs[4] = mxCreateNumericArray(2,dims,mxDOUBLE_CLASS,mxREAL);
  U  = (double*)mxGetPr(plhs[4]);

  /* Call MATLAB solver */
  mxArray *Uin[8],*Uout[2];
  Uin[0] = mxCreateNumericArray(2,dims,mxSINGLE_CLASS,mxREAL);

  memcpy(mxGetPr(Uin[0]),(some variable),m*n*sizeof(float));

はい、8つの入力があります...簡単にするために削除しました

  mexCallMATLAB(2,Uout,8,Uin,"my_matlab_solver");

次に、「Uout」の結果を次のように確認します。

  mexCallMATLAB(0,NULL,1,&Uout[0],"plot_variable");

すべてうまくいきますが、後で変数「U」を呼び出して導関数を見つける「C」コードは機能しません。

  plhs[4] = Uout[0];

  /* C code which solves for "U" based on a number of other input variables*/
  derivative(U,...,...,...)

}

「Uout[0]」を「U」に割り当てる方法がわかりません。plhs[4] = Uout[0] を設定すると、U は「my_matlab_solver」からの結果を指すと思いましたが、そうではありません。コンパイルエラーはありません。

出力用に mxArray を作成しなくても、「my_matlab_solver」の出力を直接「U」に割り当てる簡単な方法はありますか? この MEX 全体は、必要以上に複雑に見えます。助けてくれてありがとう!

4

1 に答える 1