2011-06-22 7 views
0

現在、倍精度を使用している動作するMatlab Cコード(mexファイル)があります。したがって、私は、変数のデータ型はfloatによってdoublefloat *datOut = (float*)mxGetData(mxOut);によってmxCreateNumericArray()Double-Single単精度ではなくMatlab mex-Algorithmを実行します

によって

mxCreateDoubleMatrix

double *datOut = mxGetPr(mxOut)を置き換えます。使用されている唯一の他の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で倍精度を使用すると、identicallコードはうまく動作します。私はまた、明示的にポイントをpoint = zeros(rows, 1, 'single');で渡すことによってmex-Functionを呼び出そうとしました。

私は正しい方向に向いているか、それについて私に何か示唆を与えてくれてありがとう。ありがとう!

答えて

1

abs()fabs()に置き換える必要があります。

一般的にこのような場合は、終了条件に影響する値を出力するのにmexPrintf()を使用します。つまり、上記の変更が役に立たない場合は、追加してみてください。

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

動作が期待どおりであることを確認してください。

+0

ありがとう、本当に本当に私を助けることができました。私は後で試してみて、それがうまくいくかどうか教えてくれるでしょう – tim

+0

ああ、ちょうど質問です: 'mxArray * newPnt = mxDuplicateArray(prhs [0]);'は何ですか? 'myMexFunc(ones(1000、1)) 'を介してmex-Functionを呼び出すときに' float * newPntDat =(float *)mxGetData(newPnt); 'を使用している場合でもこれは動作しますか? ()に? – tim

+0

"single"パラメータを使用する必要があります。さもなければ、mexに渡された配列はデフォルトで2倍になり、浮動小数点にキャストすることはできません(mxDuplicateArrayはどちらの方法でも動作します - 結果は入力と同じ型で、単精度配列を渡した場合のみ単一配列になります) – nimrodm

関連する問題