我有一個工作的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。
非常感謝您指點我正確的方向或給我任何提示。謝謝!
非常感謝,這真的可以幫助我。我稍後再嘗試,並告訴你它是否有效。 – tim
啊,只是問題:什麼'mxArray * newPnt = mxDuplicateArray(prhs [0]);'做什麼?即使在使用'float * newPntDat =(float *)mxGetData(newPnt);'當通過'myMexFunc(ones(1000,1))調用mex-Function'時,它還是可以工作的嗎?還是指定參數'single 'to ones()? – tim
您仍然必須使用'single'參數。否則,傳遞給mex的數組將默認爲double,並且您不能將其強制轉換爲float(mxDuplicateArray將以任一方式工作 - 結果與輸入類型相同,並且僅當您傳遞單個精度數組對我來說) – nimrodm