Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行Matlab mex算法,而不是单精度双精度_Matlab_Precision_Infinite Loop_Mex - Fatal编程技术网

运行Matlab 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(),除此之外没有其他功能。我没有对这个电话做任何更改。。。现在我有了一个永远不会结束的代码。

我有一个MatlabC代码(mex文件),目前使用双精度。于是我换了

double*datOut=mxGetPr(mxOut)
by
float*datOut=(float*)mxGetData(mxOut),

mxCreateDoubleMatrix
by
mxCreateNumericArray()

变量
double
by
float
的数据类型。正在使用的唯一其他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)编辑:也试过了,但仍然不起作用。所以我必须用许多调试输出来进一步研究它…也许你不能帮助编写更多的代码,对吗?