Mex, how to copy an array to output

7 visualizzazioni (ultimi 30 giorni)
Xingwang Yong
Xingwang Yong il 26 Dic 2020
Risposto: James Tursa il 26 Dic 2020
In my mex function my_expm.c, I calculated matrix expoential for the input matrix,
void mexFunction(int nlhs,mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double *inputMat;
double *outputMat;
int numRows;
inputMat = mxGetDoubles(prhs[0]);
numRows = mxGetM(prhs[0]);
plhs[0] = mxCreateDoubleMatrix(numRows, numRows, mxREAL);
outputMat = mxGetDoubles(plhs[0]);
outputMat = r8mat_expm1(numRows, inputMat); // matrix exponential
return;
}
Calling it by
c = my_expm([1,0;0,1])
will return all zeros, as explained in this post.
I tried the two suggestions in that post to fix this problem, both failed.
1,
by using
r8mat_expm1(numRows, inputMat, outputMat)
instead of
outputMat = r8mat_expm1(numRows, inputMat);
this still returns all zeros. I used gdb to debug, it turns out when using outputMat = r8mat_expm1(numRows, inputMat),the outputMat in mex is right and when it returns to matlab, they all become zero. But when using r8mat_expm1(numRows, inputMat, outputMat), the outputMat in mex are already all zeros. I do not know why they are zeros since I only simply changed the signature of r8mat_expm1().
2,
by using mxSetDoubles(), as in this post. This call get the work done. However, this mex function can run only once, if I call it again, matlab will crash. I can not see whether there is a problem with mxSetDoubles().
So, is there another way that I can simply copy outputMat to plhs[0]?

Risposta accettata

James Tursa
James Tursa il 26 Dic 2020

Più risposte (0)

Categorie

Scopri di più su Write C Functions Callable from MATLAB (MEX Files) in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by