0

我有一个当前使用双精度的工作 Matlab C 代码(mex 文件)。因此我更换了

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

mxCreateDoubleMatrix经过mxCreateNumericArray()

变量的数据double类型float。唯一正在使用的其他 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. 我还尝试通过显式传递点来调用 mex-Function point = zeros(rows, 1, 'single');

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

4

1 回答 1

1

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

一般来说,在这种情况下,我会使用mexPrintf()打印影响终止条件的值。即,如果上述更改没有帮助,请尝试添加

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

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

于 2011-06-23T04:03:11.530 回答