用于分配输出的mexCallMATLAB语法

时间:2013-05-23 06:28:01

标签: c matlab mex

我花了一个星期的时间来解决以下问题,我不能为我的生活搞清楚!我将尽可能简短地使用代码并删除不相关的行,但应该清楚我的问题。对于初学者,我将Matlab与C结合使用,C通过mex文件进行通信。没有进一步的... ...

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”的衍生物的价值。然后我想比较解算器,所以我换了一个Matlab函数的“solve(U)”,我通过“mexCallMATLAB”调用它。这是我迷路的地方

(我再次删除了无关的变量)

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”的结果,但事实并非如此。没有编译错误。

是否有更简单的方法可以将“my_matlab_solver”的输出直接分配给“U”,而不必为输出设置mxArray?这整个MEX似乎比它需要的复杂得多。谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

如果没有看到更多代码,很难说出问题所在。正如我在评论中提到的,我怀疑你是在错误的变量中分配值......

这是一个玩具示例,展示如何从MEX函数调用MATLAB并操作数组。也许这会有所帮助:

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    // check for proper number of input/output
    if(nrhs != 0 || nlhs > 2) {
        mexErrMsgIdAndTxt("mex:nlhs", "Wrong number of arguments.");
    } 

    // call: out1 = rand(5,5); out2 = rand(5,5);
    mxArray *Uin[2], *Uout[2];
    Uin[0] = mxCreateDoubleScalar(5);
    Uin[1] = mxCreateDoubleScalar(5);
    mexCallMATLAB(1, &Uout[0], 2, Uin, "rand");
    mexCallMATLAB(1, &Uout[1], 2, Uin, "rand");

    // compute: out = out1 + out2; and assign it to output
    plhs[0] = mxCreateDoubleMatrix(5,5,mxREAL);
    double *x = mxGetPr(Uout[0]);
    double *y = mxGetPr(Uout[1]);
    double *z = mxGetPr(plhs[0]);
    for(int i=0; i<5*5; ++i) {
        *z = *x + *y;
        ++x; ++y; ++z;
    }

    // free memory
    mxDestroyArray(Uin[0]);
    mxDestroyArray(Uin[1]);
    mxDestroyArray(Uout[0]);
    mxDestroyArray(Uout[1]);
}