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])
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]?
Best Answer