如何有效地传递mex中的int指针数组?

时间:2017-10-11 02:19:19

标签: matlab mex

我有一个简单的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,vOCT_EXP中的索引OCT_LOG必须是整数类型,因此我需要在循环中将u=(int)u_vec[i];从double转换为int。我想我们可以有更好的方法将整数数组传递给mex。我是对的吗?

0 个答案:

没有答案