<< Chapter < Page | Chapter >> Page > |
The main MATLAB structure used for holding data in MEX-Files is the mxArray. This structure can hold real data, complex data, arrays, matrices, sparse-arrays, strings, and a whole host of other MATLAB data-structures.Using data from some of the basic structures is shown here, but refer to the MATLAB help for using other data structures.
Lets use my example from above (if you forgot:
[z0,z1] = jasonsFunction(x,y,z);
).
Assume that x is a 2-D matrix, y is a string, and z is an integer. Here we wills ee how to extractand use these different types of data.
We have access to the input paramter x by a pointer held in the array prhs. In C, when referencing an array by index, the variable is automatically dereferenced (ie: you dont need to use a star).For clarity, I will copy the variable x over to an mxArray pointer named xData (This does not need to be done for the code to work).
//---Inside mexFunction---
//DeclarationsmxArray *xData;
double *xValues;int i,j;
int rowLen, colLen;double avg;
//Copy input pointer xxData = prhs[0];//Get matrix x
xValues = mxGetPr(xData);rowLen = mxGetN(xData);
colLen = mxGetM(xData);//Print the integer avg of each col to matlab console
for(i=0;i<rowLen;i++)
{avg=0;
for(j=0;j<colLen;j++)
{avg += xValues[(i*colLen)+j];
//Another Method://
//avg += *xValues++;}
avg = avg/colLen;printf("The average of row %d, is %d",i,(int)avg);
}
The function
mxGetPr
is used to get a pointer to the real data xData. This function takes a
pointer to an mxArray as the intput paramter, and returns a pointer array of doubles. A similar function
mxGetPi
can be used for complex data.
mxGetN
and
mxGetM
return
integers of the lengths of the row and column in the matrix. If this were an array of data, one of thesereturn values would be zero. MATLAB gives the matrix as rows first, then columns (if you were to traverse
the matrix linearly) so to jump by position, (x,y) maps to x*colLen+y. MATLAB organizesits arrays this way to reduce cache misses when the row traversal is on the outside loop. It is good to
code it this way if you are working for efficiency.
printf()
will print out to the MATLAB command prompt.
Getting a string is very similar, but has its own method. The example below shows the procedure for getting a string. Again, I will copy the input to a pointer called yData.
//---Inside mexFunction---
//DeclarationsmxArray *yData;
int yLength;char *TheString;
//Copy input pointer yyData = prhs[1];//Make "TheString" point to the string
yLength = mxGetN(yData)+1;TheString = mxCalloc(yLength, sizeof(char)); //mxCalloc is similar to malloc in C
mxGetString(yData,TheString,yLength);
This last example shows how to get a simple integer. This is the method that has always worked for me, but it seems kind of strange so I imagine there is another way to do this.
Notification Switch
Would you like to follow the 'An introduction to matlab' conversation and receive update notifications?