我花了一个星期的时间来解决以下问题,我不能为我的生活搞清楚!我将尽可能简短地使用代码并删除不相关的行,但应该清楚我的问题。对于初学者,我将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似乎比它需要的复杂得多。谢谢你的帮助!
答案 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]);
}