I have a working Matlab C code (mex files) which currently uses double precision. Thus I replaced
double *datOut = mxGetPr(mxOut) by float *datOut = (float*)mxGetData(mxOut);,
mxCreateDoubleMatrix by mxCreateNumericArray()
and
the datatypes of the variables double by float. The only other mex-Function which is being used is mxDuplicateArray() but nothing else. I didn’t change anything to this call… Now I have a Code running which never finishes. I stripped it down quite a bit so that I hope it’s short enough that somebody could help me:
float myFunc(const mxArray *point, int index)
{
float *dat = (float*)mxGetData(point);
return dat[index]*dat[index]*dat[index];
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
float h, f0, df1, df2, diff;
// Input Vars #1
float diff = (float)mxGetScalar(prhs[1]);
float H = (float)mxGetScalar(prhs[2]);
int index1 = (int)mxGetScalar(prhs[3]);
int index2 = (int)mxGetScalar(prhs[4]);
// Input Vars #2 -> Duplicate it
mxArray *newPnt = mxDuplicateArray(prhs[0]);
float *newPntDat = (float*)mxGetData(newPnt);
// ...
// PERHAPS SOME UNIMPORANT CODE HERE ...
// ...
h = H;
f0 = myFunc(prhs[0], index1);
newPntData[ index2 ] += h;
df1 = (myFunc(newPnt, index1)-f0)/h;
while(true)
{
h /= 2;
newPntDat[ index2 ] -= h;
df2 = (myFunc(newPnt, index1)-f0)/h;
// If precision is okay
if(abs(df2-df1) <= diff)
break;
// Save for next loop iteration
df1 = df2;
}
// Return df2-Value to Matlab
}
somehow it’s an infinite loop and I dunno why since the precision which is defined via diff should be easily reachable for the given function myFunc(). The identicall code runs fine when using double precision with the both functions double *datOut = mxGetPr(mxOut) and mxCreateDoubleMatrix. I also tried to call the mex-Function by explicitly pass the point via point = zeros(rows, 1, 'single');.
Thanks very much for pointing me to the right direction or giving me ANY hint about it. Thanks!
You need to replace
abs()withfabs().In general, in such cases, I would use
mexPrintf()to print the values that affect the termination condition. I.e., if the above change does not help, try addingJust to make sure the behavior is as you expected.