Search code examples
c++matlabmexmemcpymatrix-indexing

memcpy function calling inside mex


I have an interesting problem. Namely like that; I am trying to use std::memcpy function inside by mex function and calling that mex function inside MATLAB like that;

I2 = b_filter(I);

When I copy the whole image, it works well;

plhs[0] =  mxCreateDoubleMatrix(mxGetM(plhs[0]), mxGetN(plhs[0]), mxREAL);          
memcpy(mxGetPr(plhs[0]), mxGetPr(prhs[0]), sizeof(double) *mxGetM(plhs[0]) * mxGetN(plhs[0]));

But when I try to copy some part of image

plhs[0] =  mxCreateDoubleMatrix(100, 100, mxREAL);              
memcpy(mxGetPr(plhs[0]), mxGetPr(prhs[0]), sizeof(double) * 100 * 100);

it doesn't give right image part but gives unmeaningful pixel values.

So what is going on here?


Solution

  • Ha Ha! You've been caught by one of the nastiest of mex file nuances! It's got me before too. Arrays in mex functions are stored in column order not row order, so you:

    You still use column-first indexing like in Matlab, though

    Blog URL

    Try this page too for a nice picture of the ordering.

    Figure From Mathworks

    Finally I would recommend reading this thread to get a better idea behind the difference of C and MATLAB matrix memory being column-ordered.