MATLAB: Do not understand mxSetData

floatsmuliple callsmxsetdata

Hi, I have declared a pointer to a float
float *myvariable;
I initialize this to
myvariable = mxCreateNumericMatrix(256,1,SINGLE (sorry for not the exact syntax),0);
Then I call a function func(myvariable);
This function does math on myvariable and returns the pointer.
Now if I have to output this variable, I get Matlab crash with this:
mxSetData(plhs[0],(float*)myvariable);
I have tried mxFree before the line but still a problem.
Questions: 1. If the second parameter is void according to definition how come my program compiles fine without error.
2. Why does Matlab crash (implying memory leak)?
3. The other option works and this is
plhs[0] = mxCreateNumericArray(256 matrix of SINGLE 0) and finally myvariable=mxGetData(plhs[0]); func(myvariable);
The reason I do not like this way is
a. I would prefer to run the function first and then assign the return to plhs[0];
b. It is a very ugly way of doing it like this, though it works.
c. I would at some point like to declare "myvariable" to be static so that every time it is requested by Matlab function some.m, I do not initialize it to 0. And I have many such variables to work with. I am updating data every fraction of a second for several minutes.
And I have to work with floats
Thanks

Best Answer

mxCreateNumericMatrix creates a Matlab variable and returns a mxArray * pointer to it. This variable has a header, e.g. the type of the values, and contains a pointer to the actual data, see mxGetPr for a DOUBLE array or mxGetData for all other types.
mxSetData injects a pointer to the data manually to the Matlab variable. This overwrites the pointer to the existing values. If you assign an mxArray pointer to the data, a crash is expected.
You have to distinguish between the Matlab arrays and their data:
float *data;
plhs[0] = mxCreateNumericMatrix(...);
data = (float *) mxGetData(plhs[0]);
func(data);
I prefer to use Matlab arrays in the main function (mexFunction) only and call all subfunctions using the C-pointers to the underlying data. Then the mexFunction is the gateway between Matlab and C and it is easy to use the subfunctions in a pure C program also.
Related Question