【发布时间】:2011-09-20 18:02:47
【问题描述】:
我有一个当前使用双精度的工作 Matlab C 代码(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 使用双精度时,相同的代码运行良好。我还尝试通过 point = zeros(rows, 1, 'single'); 显式传递点来调用 mex-Function。
非常感谢您指出正确的方向或给我任何提示。谢谢!
【问题讨论】:
标签: matlab precision infinite-loop mex