Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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
C Matlab mex内存处理-相同输入不同结果_C_Matlab_Memory_Mex - Fatal编程技术网

C Matlab mex内存处理-相同输入不同结果

C Matlab mex内存处理-相同输入不同结果,c,matlab,memory,mex,C,Matlab,Memory,Mex,我已经将Matlab代码中计算量大的部分转换成了一个C mex文件,这大大加快了计算速度。问题在于,在一些运行中,C mex代码给出的结果与Matlab代码完全相同(在机器精度范围内),而在另一些运行中,两者之间存在显著差异(甚至达到1e-3)。此外,有时cmex代码会在连续运行中使用完全相同的输入给出不同的结果,从而与自身不一致。我想这个问题可能是由于我的编程导致内存处理错误造成的。这很可能是因为这是我第一次尝试创建cmex文件 我附加了我的mexFunction,它调用另一个C函数(在同一个

我已经将Matlab代码中计算量大的部分转换成了一个C mex文件,这大大加快了计算速度。问题在于,在一些运行中,C mex代码给出的结果与Matlab代码完全相同(在机器精度范围内),而在另一些运行中,两者之间存在显著差异(甚至达到1e-3)。此外,有时cmex代码会在连续运行中使用完全相同的输入给出不同的结果,从而与自身不一致。我想这个问题可能是由于我的编程导致内存处理错误造成的。这很可能是因为这是我第一次尝试创建cmex文件

我附加了我的mexFunction,它调用另一个C函数(在同一个文件中)来执行计算。如果你能就我的问题给我一些见解,我将不胜感激。如果您需要代码的任何其他部分,请告诉我

提前感谢,

帕诺斯


我看不出代码中有任何明显的错误。我通常在使用
mxGetPr
之后显式地强制转换所有内容,所以请尝试这样做。BladeElementGC如何分配GCBladeElement?最后,在BladeElementGC中,您可以打印所有输入变量并检查它们是否一直正确传递吗?亲爱的Ansari,谢谢您的帮助。我尝试过显式的施法,但没有任何改变。我已经尝试打印BladeElementGC的输入数据,一切看起来都很好(对于我尝试过的测试用例)。我在我的消息中添加了BladeElementGC子例程,供您参考。如果您需要进一步的帮助,请告诉我,再次感谢。我已经通过打印不同的变量并比较Matlab和C进行了广泛的测试,发现了一系列非常微妙的错误,仅使用Matlab不会导致问题,但在结合Matlab和C时产生了麻烦。问题几乎解决了,非常感谢您的时间!我看不出代码中有任何明显的错误。我通常在使用
mxGetPr
之后显式地强制转换所有内容,所以请尝试这样做。BladeElementGC如何分配GCBladeElement?最后,在BladeElementGC中,您可以打印所有输入变量并检查它们是否一直正确传递吗?亲爱的Ansari,谢谢您的帮助。我尝试过显式的施法,但没有任何改变。我已经尝试打印BladeElementGC的输入数据,一切看起来都很好(对于我尝试过的测试用例)。我在我的消息中添加了BladeElementGC子例程,供您参考。如果您需要进一步的帮助,请告诉我,再次感谢。我已经通过打印不同的变量并比较Matlab和C进行了广泛的测试,发现了一系列非常微妙的错误,仅使用Matlab不会导致问题,但在结合Matlab和C时产生了麻烦。问题几乎解决了,非常感谢您的时间!
void BladeElementGC(const mwIndex InterestBE, const mwIndex BladeElement,
        const double *WakeXYZ, const double *RQuarter, const double *BE_RControl, const double *BE_Gamma,
        const mwSize NoOfBlades, const mwSize NoOfFilaments, const mwSize NoOfSegments, const mwSize NoOfWakeItems,
        const mwSize NoOfElements,
        const double conf_CompressibleBiot, const double conf_M, const double conf_CompressibleWakeMachMax,
        const double conf_VortexCoreOffset,
        const double conf_VortexDelta,
        const double conf_kin_visc,
        const double conf_VatistasN,
        const double conf_BoundVorticity,
        double *GCBladeElement)
{

    mwIndex Filament;
    double Temp1[3], Temp2[3], Temp3[3];

    GCBladeElement[0] = 0.;
    GCBladeElement[1] = 0.;
    GCBladeElement[2] = 0.;

    Filament = BladeElement;


    TrailingFilamentGC(InterestBE, Filament,
        WakeXYZ, BE_RControl, BE_Gamma,
        NoOfBlades, NoOfFilaments, NoOfSegments, NoOfWakeItems,
        NoOfElements,
        conf_CompressibleBiot, conf_M, conf_CompressibleWakeMachMax,
        conf_VortexCoreOffset,
        conf_VortexDelta,
        conf_kin_visc,
        conf_VatistasN,
        Temp1);


    TrailingFilamentGC(InterestBE, Filament+1,
        WakeXYZ, BE_RControl, BE_Gamma,
        NoOfBlades, NoOfFilaments, NoOfSegments, NoOfWakeItems,
        NoOfElements,
        conf_CompressibleBiot, conf_M, conf_CompressibleWakeMachMax,
        conf_VortexCoreOffset,
        conf_VortexDelta,
        conf_kin_visc,
        conf_VatistasN,
        Temp2);

    if (conf_BoundVorticity>0)
    {

        BoundElementGC(InterestBE, BladeElement,
        WakeXYZ, RQuarter, BE_RControl, BE_Gamma,
        NoOfBlades, NoOfFilaments, NoOfSegments, NoOfWakeItems,
        NoOfElements,
        conf_CompressibleBiot, conf_M, conf_CompressibleWakeMachMax,
        conf_VortexCoreOffset,
        conf_VortexDelta,
        conf_kin_visc,
        conf_VatistasN,
        Temp3);

    }
    else
    {
        Temp3[0] = 0.;
        Temp3[1] = 0.;
        Temp3[2] = 0.;
    }


    GCBladeElement[0] = Temp2[0] - Temp1[0] + Temp3[0];
    GCBladeElement[1] = Temp2[1] - Temp1[1] + Temp3[1];
    GCBladeElement[2] = Temp2[2] - Temp1[2] + Temp3[2];



}




/* The gateway function */
void mexFunction( int nlhs, mxArray *plhs[],
                  int nrhs, const mxArray *prhs[])
{

    mwIndex InterestBE;
    mwIndex BladeElement;
    double *WakeXYZ;
    double *RQuarter;
    double *BE_RControl;
    double *BE_Gamma;
    double *GCBladeElement;

    const mwSize *dimsWakeXYZ;
    const mwSize *dimsBE_RControl;

    mwSize NoOfBlades, NoOfFilaments, NoOfSegments, NoOfWakeItems;
    mwSize NoOfElements, NoOfDimensions;

    double p_CompressibleBiot;
    double *p_M;
    double *p_CompressibleWakeMachMax;
    mwSize p_WakePointsNo;
    double p_BoundVorticity;

    double *p_VortexCoreOffset;
    double *p_VortexDelta;
    double *p_kin_visc;
    double *p_VatistasN;


    //----------------------------------------------------------
    // First retrieve inputs
    //----------------------------------------------------------

    /* Get the value of the scalar input InterestBE  */
    InterestBE = (mwIndex)mxGetScalar(prhs[0]);

    /* Get the value of the scalar input Filament  */
    BladeElement = (mwIndex)mxGetScalar(prhs[1]);

    /* create a pointer to the real data in the WakeXYZ matrix  */
    WakeXYZ = mxGetPr(prhs[2]);

    /* create a pointer to the real data in the RQuarter matrix  */
    RQuarter = mxGetPr(prhs[3]);

    /* create a pointer to the real data in the BE_RControl matrix  */
    BE_RControl = mxGetPr(prhs[4]);

    /* create a pointer to the real data in the BE_RControl matrix  */
    BE_Gamma = mxGetPr(prhs[5]);


    /* create pointers to the fields of the conf structure  */

    p_CompressibleBiot = mxGetScalar(mxGetField(prhs[6], 0, "CompressibleBiot"));
    p_M = mxGetPr(mxGetField(prhs[6], 0, "M"));
    p_CompressibleWakeMachMax = mxGetPr(mxGetField(prhs[6], 0, "CompressibleWakeMachMax"));
    p_VortexCoreOffset = mxGetPr(mxGetField(prhs[6], 0, "VortexCoreOffset"));
    p_VortexDelta = mxGetPr(mxGetField(prhs[6], 0, "VortexDelta"));
    p_kin_visc = mxGetPr(mxGetField(prhs[6], 0, "kin_visc"));
    p_VatistasN = mxGetPr(mxGetField(prhs[6], 0, "VatistasN"));
    p_WakePointsNo = (mwSize)mxGetScalar(mxGetField(prhs[6],0,"WakePoints"));
    p_BoundVorticity = mxGetScalar(mxGetField(prhs[6],0,"BoundVorticity"));

    // Get the dimensions of the WakeXYZ array
    dimsWakeXYZ = mxGetDimensions(prhs[2]);

    // Get the dimensions of the BE_RControl array
    dimsBE_RControl = mxGetDimensions(prhs[4]);

    NoOfBlades = dimsWakeXYZ[0];
    NoOfFilaments = dimsWakeXYZ[1];
    NoOfSegments = dimsWakeXYZ[2];
    NoOfWakeItems = dimsWakeXYZ[3];
    NoOfElements = dimsBE_RControl[1];

    //----------------------------------------------------------
    // Call the calculation subroutine
    //----------------------------------------------------------

    /* create the output matrix */
    plhs[0] = mxCreateDoubleMatrix(1,3,mxREAL);
    GCBladeElement = mxGetPr(plhs[0]);

    BladeElementGC(InterestBE, BladeElement,
            WakeXYZ, RQuarter, BE_RControl, BE_Gamma,
            NoOfBlades, NoOfFilaments, NoOfSegments, NoOfWakeItems,
            NoOfElements,
            p_CompressibleBiot, *p_M, *p_CompressibleWakeMachMax,
            *p_VortexCoreOffset,
            *p_VortexDelta,
            *p_kin_visc,
            *p_VatistasN,
            p_BoundVorticity,
            GCBladeElement);

 }