2011-06-22 450 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