运行Matlab mex算法,而不是单精度双精度
我有一个MatlabC代码(mex文件),目前使用双精度。于是我换了运行Matlab mex算法,而不是单精度双精度,matlab,precision,infinite-loop,mex,Matlab,Precision,Infinite Loop,Mex,我有一个MatlabC代码(mex文件),目前使用双精度。于是我换了 double*datOut=mxGetPr(mxOut)byfloat*datOut=(float*)mxGetData(mxOut), mxCreateDoubleMatrixbymxCreateNumericArray() 及 变量doublebyfloat的数据类型。正在使用的唯一其他mex函数是mxDuplicateArray(),除此之外没有其他功能。我没有对这个电话做任何更改。。。现在我有了一个永远不会结束的代码。
double*datOut=mxGetPr(mxOut)
byfloat*datOut=(float*)mxGetData(mxOut)代码>,
mxCreateDoubleMatrix
bymxCreateNumericArray()
及
变量double
byfloat
的数据类型。正在使用的唯一其他mex函数是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
}
float myFunc(常量mxArray*点,整数索引)
{
float*dat=(float*)mxGetData(点);
返回dat[索引]*dat[索引]*dat[索引];
}
void MEX函数(int nlhs、mxArray*plhs[]、int nrhs、const mxArray*prhs[])
{
浮点数h,f0,df1,df2,diff;
//输入变量#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]);
//输入变量#2->复制它
mxArray*newPnt=mxDuplicateArray(prhs[0]);
float*newPntDat=(float*)mxGetData(newPnt);
// ...
//也许这里有些无关紧要的代码。。。
// ...
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;
//如果精度可以的话
如果(abs(df2-df1)您需要将abs()
替换为fabs()
通常,在这种情况下,我会使用mexPrintf()
打印影响终止条件的值。也就是说,如果上述更改没有帮助,请尝试添加
mexPrintf("%g %g %g %g\n",df2,df1,diff, fabs(df2-df1));
只是为了确保行为符合您的预期。非常感谢,这真的可以帮助我。我稍后会尝试并告诉您它是否有效。啊,问题是:mxArray*newPnt=mxDuplicateArray(prhs[0]);
可以做什么?即使使用float*newPntDat=(float*)mxGetData(newPnt*),这是否也有效
仅通过myMexFunc(ones(1000,1))调用mex函数时
或者我必须这样指定参数'single'到ones()?您仍然必须使用'single'参数。否则传递给mex的数组默认为double,并且无法将其强制转换为float(mxDuplicateArray将以任何一种方式工作——结果与输入类型相同,并且只有当您将单个精度数组传递给mex时,结果才是单个数组)好的,再次感谢-我也是这么想的:)我试过了,但不知何故,当将其转换为使用浮点数时,该算法不起作用……问题:因为H
和diff
是输入参数(我将其转换为浮点数),用于中止条件if(abs(df2-df1)编辑:也试过了,但仍然不起作用。所以我必须用许多调试输出来进一步研究它…也许你不能帮助编写更多的代码,对吗?