2011-06-22 247 views
0

我有一个工作的Matlab C代码(mex文件),它目前使用双精度。因此,我通过float取代运行Matlab mex算法代替双精度单精度

double *datOut = mxGetPr(mxOut)float *datOut = (float*)mxGetData(mxOut);

mxCreateDoubleMatrix通过mxCreateNumericArray()

变量double的数据类型。唯一正在使用的其他mex-Function是mxDuplicateArray(),但没有别的。我没有改变任何东西给这个电话...现在我有一个代码运行,永远不会完成。我剥离下来颇有几分所以,我希望它是足够短,有人可以帮助我:

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 
} 

不知它是一个无限循环,我不知道为什么,因为它是通过diff定义的精度应该是很容易到达给定功能myFunc()。使用双精度函数double *datOut = mxGetPr(mxOut)mxCreateDoubleMatrix时,相同的代码运行良好。我还尝试通过point = zeros(rows, 1, 'single');明确地通过该点来调用mex-Function。

非常感谢您指点我正确的方向或给我任何提示。谢谢!

回答

1

您需要用fabs()替换abs()

通常,在这种情况下,我会使用mexPrintf()来打印影响终止条件的值。即,如果上述更改无效,请尝试添加

mexPrintf("%g %g %g %g\n",df2,df1,diff, fabs(df2-df1)); 

只是为了确保行为符合您的预期。

+0

非常感谢,这真的可以帮助我。我稍后再尝试,并告诉你它是否有效。 – tim

+0

啊,只是问题:什么'mxArray * newPnt = mxDuplicateArray(prhs [0]);'做什么?即使在使用'float * newPntDat =(float *)mxGetData(newPnt);'当通过'myMexFunc(ones(1000,1))调用mex-Function'时,它还是可以工作的吗?还是指定参数'single 'to ones()? – tim

+0

您仍然必须使用'single'参数。否则,传递给mex的数组将默认为double,并且您不能将其强制转换为float(mxDuplicateArray将以任一方式工作 - 结果与输入类型相同,并且仅当您传递单个精度数组对我来说) – nimrodm