0

現在倍精度を使用しているMatlabCコード(mexファイル)が機能しています。したがって、私は置き換えました

double *datOut = mxGetPr(mxOut)によってfloat *datOut = (float*)mxGetData(mxOut);

mxCreateDoubleMatrixmxCreateNumericArray()

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 に答える