我有一个简单的MATLAB代码
function val = mul( u, v )
u_v_bigger=( u > 255 )|( v > 255 );
if (u_v_bigger)
error(['Input values larger than allowed!]);
end
OCT_EXP = [1, 2, 4, 8, 16, 32, 64];
OCT_LOG = [ 0, 1, 25, 2, 50, 26, 198];
u_v_zeros=( u == 0 )|( v == 0 );
if (u_v_zeros)
val = 0;
else
val = OCT_EXP( OCT_LOG(u) + OCT_LOG(v) + 1);
end
我可以使用
来调用它val(1:3)=mul( [1 3 5], [2 4 5] )
现在,我通过使用MEX来加速代码来重写它。我的代码mul_fast.cpp
是
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray* prhs[])
{
static const int OCT_LOG[] = {0, 1, 25, 2, 50, 26,198};
static const int OCT_EXP[] ={1, 2, 4, 8, 16, 32, 64};
double* u_vec = mxGetPr(prhs[0]);
double* v_vec = mxGetPr(prhs[1]);
int u;
int v;
mwSize length_1 = mxGetN(prhs[0]);
double *result = (double*) malloc(length_1*sizeof(double));
for (int i=0;i<length_1;i++){
u=(int)u_vec[i];
v=(int)v_vec[i];
if (u>255 || v>255 )
mexErrMsgTxt("Input values larger than allowed");
else if (u==0 || v==0 )
result[i] = 0;
else {
result[i] = OCT_EXP[OCT_LOG[u-1] + OCT_LOG[v-1]];
}
}
plhs[0] = mxCreateDoubleMatrix(1, length_1, mxREAL);
memcpy(mxGetPr(plhs[0]), result, length_1*sizeof(double));
// dellocate heap space
free(result);
}
我比较了MATLAB和MEX代码的两个结果,效果很好。但是,在我的MEX代码中,我发现了一个需要您建议的问题。因为u,v
和OCT_EXP
中的索引OCT_LOG
必须是整数类型,因此我需要在循环中将u=(int)u_vec[i];
从double转换为int。我想我们可以有更好的方法将整数数组传递给mex。我是对的吗?