Dynamic-Calibration/utils/YALMIP-master/extras/findhashsorted.c

81 lines
2.0 KiB
C
Raw Permalink Normal View History

2019-12-18 11:25:45 +00:00
#include "mex.h"
void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray*prhs[])
{
int mid, m, high, low, i;
double *position,*hashtable,*hashsearch,hashval;
hashtable = mxGetPr(prhs[0]);
hashsearch = mxGetPr(prhs[1]);
hashval = hashsearch[0];
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
position = mxGetPr(plhs[0]);
position[0] = 0;
m = mxGetNumberOfElements(prhs[0]);
if (m>0)
{
low = 0;
high = m-1;
i = 0;
if (hashtable[0] > hashval)
{
// No way, the number is smaller than lowest number in table
position[0] = 0;
}
else if (hashtable[high] < hashval)
{
position[0] = 0;
}
else
{
mid = (high+low)/2;
i = 0;
while (mid < high & low < mid)
{
i++;
if (i>=2*m)
{
//mexPrintf("What!! %i",mid);
break;
}
if (hashtable[mid] < hashval)
{
// mexPrintf("Low %i %i %i\n",low,mid,high);
low = mid;
}
else if (hashtable[mid] > hashval)
{
// mexPrintf("High %i %i %i\n",low,mid,high);
high = mid;
}
else if (hashtable[mid] == hashval)
{
// mexPrintf("Match %i %i %i\n",low,mid,high);
position[0] = mid+1;
break;
}
mid = (high+low)/2;
}
if (hashtable[low] == hashval)
{
position[0] = low+1;
}
else if (hashtable[high] == hashval)
{
position[0] = high+1;
}
}
}
if (position[0] == 0)
{
plhs[0] = mxCreateDoubleMatrix(0, 0, mxREAL);
}
}