Mex file crash when called second time

I am a new hand at mex. I just finished a test mex file of matrix addition. But it crashed when i called it the second time. Then I tried restarting several times, but it still couldn't work.
A little crazy...Really look forward to your solution.
PS:version : 2013a compiler: VS2012 system: win7 Ultimate 64bit
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
{
mxArray *a;
mxArray *b;
mxArray *out;
mwSize m,n;
int i;
int j;
a = plhs[0];
b = prhs[1];
m = mxGetM(plhs[0]);
n = mxGetM(prhs[1]);
if(m!=n)
{
mexErrMsgTxt("Dimensions mismatch!");
}
else
{
m = mxGetN(plhs[0]);
n = mxGetN(prhs[1]);
if(m!=n)
mexErrMsgTxt("Dimensions mismatch!");
else
m = mxGetM(plhs[0]);
n = mxGetN(plhs[0]);
}
for(i=0; i< m ; i++)
for(j =0; j<n; j++)
{
*(mxGetPr(out) + i *n +j) = *(mxGetPr(a) + i *n +j)+*(mxGetPr(b) + i *n +j);
}
mexPrintf("addition is done");
}

Réponses (1)

James Tursa
James Tursa le 21 Mai 2013
Modifié(e) : James Tursa le 21 Mai 2013
I have taken your code and made several corrections. By comparing side by side you should be able to tell what the errors were. Pay special attention to what Friedrich has already written ... you need to create the output plhs[0] yourself, MATLAB does not do this for you. I reordered your loops so that the inner loop goes over the row indexes first ... that way the elements are accessed in order as they appear in memory, which is better for high level caching. I didn't do it obviously, but you could rewrite your loops as a single loop using mxGetNumberOfElements to handle any dimension of inputs, not just 2D. That will be left as an exercise for the reader ...
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
mxArray *a;
mxArray *b;
mxArray *out;
mwSize m, n;
int i;
int j;
double *apr, *bpr, *outpr;
if( nrhs != 2 || !mxIsDouble(prhs[0]) || !mxIsDouble(prhs[1]) ||
mxIsSparse(prhs[0]) || mxIsSparse(prhs[1]) ||
mxIsComplex(prhs[0]) || mxIsComplex(prhs[1]) ||
mxGetNumberOfDimensions(prhs[0]) != 2 ||
mxGetNumberOfDimensions(prhs[1]) != 2 ) {
mexErrMsgTxt("Need two full real double 2D matrix inputs.");
}
if( nlhs > 1 ) {
mexErrMsgTxt("Too many outputs.");
}
a = prhs[0];
b = prhs[1];
m = mxGetM(a);
n = mxGetM(b);
if( m != n ) {
mexErrMsgTxt("Dimensions mismatch!");
} else {
m = mxGetN(a);
n = mxGetN(b);
if( m != n ) {
mexErrMsgTxt("Dimensions mismatch!");
} else {
m = mxGetM(a);
n = mxGetN(a);
plhs[0] = mxCreateDoubleMatrix( m, n, mxREAL );
out = plhs[0];
apr = mxGetPr(a);
bpr = mxGetPr(b);
outpr = mxGetPr(out);
for( j =0; j<n; j++ ) {
for( i=0; i< m ; i++ ) {
*(outpr + j*m +i) = *(apr + j*m + i) + *(bpr + j*m + i);
// *outpr++ = *apr++ + *bpr++; // could have done this instead
}
}
}
}
mexPrintf("addition is done\n");
}

Catégories

En savoir plus sur MATLAB Compiler dans Centre d'aide et File Exchange

Produits

Tags

Question posée :

le 21 Mai 2013

Community Treasure Hunt

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

Start Hunting!

Translated by