81 lines
2.0 KiB
C
Executable File
81 lines
2.0 KiB
C
Executable File
#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);
|
|
}
|
|
}
|