Copying 2-D C++ array into mxArrays

1 view (last 30 days)
If I have a pointer *ptr that is pointing to a 2-D array of UINT16 type in C++, what code in a CMEX file will convert that data to a mxArray that can be output to MATLAB? Ultimately what I want is a myfunction.mexw64 file where Z = myfunction executed in MATLAB provides the original 2-D array that I have right now in C++.

Accepted Answer

James Tursa
James Tursa on 30 May 2014
Edited: James Tursa on 30 May 2014
If the array elements are in column order in the C++ file, then a simple copy will suffice. E.g.,
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
unsigned short *pr;
unsigned short ptr[] = {1,2,3,4,5,6};
mwSize i, m = 2, n = 3, mn = m*n;
plhs[0] = mxCreateNumericMatrix(m,n,mxUINT16_CLASS,mxREAL);
pr = mxGetPr(plhs[0]);
for( i=0; i<mn; i++ ) {
pr[i] = ptr[i];
}
}
In the above code I have used an array for ptr for simplicity, but a pointer to a block of memory will work just as well.
If the elements are in row order instead of column order, a transpose will be involved. If that is the case, let me know and I will post that code. (Or you can just transpose it at the MATLAB level)
  2 Comments
Robert Hinkey
Robert Hinkey on 30 May 2014
Edited: Robert Hinkey on 30 May 2014
Thanks James. One small adjustment is needed, the line:
pr = mxGetPr(plhs[0]);
should read:
pr = (unsigned short*)mxGetData(plhs[0]);
since the mxGetPr is for type double only. The original line maybe works for some people, but my Visual C++ 2008 compiler doesn't like it.
James Tursa
James Tursa on 30 May 2014
Edited: James Tursa on 30 May 2014
Correct. I had modified some double code that I already had and missed that. Thanks.

Sign in to comment.

More Answers (0)

Categories

Find more on Write C Functions Callable from MATLAB (MEX Files) in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!