C和MATLAB:在C中创建空数组会调用Matlab函数来填充它,但以错误结尾

时间:2018-11-14 11:34:41

标签: c arrays matlab segmentation-fault

这是问题所在

我有一个C代码,它创建一个填充有随机数的数组nRows x 2,称为InitialArray。然后,我将该数组分为两部分,即第一列称为xProcess,第二列称为yProcess。 目的是将我创建的这些变量(xProcessyProcess传递给Matlab,在那里,基于概率规则的Matlab函数会将NaN放在{{1}的某些元素中}和xProcess,并在转到yProcess之前用xCyC的值填充名为xProcessyProcess的空数组。 最后,C代码再次取回所有四个数组,对它们执行一些操作,然后再次将它们发送到Matlab。重复此过程需要很多时间。

下面是一段代码:

NaN

到目前为止,我创建了mxArray以及将存储在int main ( void ){ Engine *ep; if (!(ep = engOpen(""))) { fprintf(stderr, "\nCan't start MATLAB engine\n"); return EXIT_FAILURE; } mxArray *xProcess = NULL; mxArray *yProcess = NULL; mxArray *xC = NULL; mxArray *yC = NULL; int timeStep; int numberProcess = 4e6; int numberC = 0; xProcess中的随机数。现在进入循环。

yProcess

如您所见for (timeStep=0 ; timeStep<numberTimeSteps ; timeStep++){ double *arrayTempxProcess; arrayTempxProcess = (double *)calloc(numberProcess, sizeof(double)); double *arrayTempyProcess; arrayTempyProcess = (double *)calloc(numberProcess, sizeof(double)); double *arrayTempxC; arrayTempxC=(double *)calloc(numberC, sizeof(double)); double *arrayTempyC; arrayTempyC=(double *)calloc(numberC, sizeof(double)); xProcess = mxCreateDoubleMatrix(numberProcess, 1, mxREAL); yProcess = mxCreateDoubleMatrix(numberProcess, 1, mxREAL); xC = mxCreateDoubleMatrix(numberC, 1, mxREAL); yC = mxCreateDoubleMatrix(numberC, 1, mxREAL); memcpy((void *)mxGetPr(yProcess), (void *)arrayTempyProcess, numberProcess*sizeof(double)); memcpy((void *)mxGetPr(xProcess), (void *)arrayTempxProcess, numberProcess*sizeof(double)); xC,我将它们创建为空。我相信这相当于Matlab中的yCxC = []yC = []arrayTempyProcess是时间数组,它们每个都获得arrayTempxProcess的列。

InitialArray

现在我将它们发送到Matlab

if(timeStep>0){
memcpy((void *)mxGetPr(yC), (void *)arrayTempyC,(numberC)*sizeof(double));
memcpy((void *)mxGetPr(xC), (void *)arrayTempxC, (numberC)*sizeof(double)); 

}

现在,Matlab函数将engPutVariable(ep, "xProcess", xProcess); engPutVariable(ep, "yProcess", yProcess); engPutVariable(ep, "xC", xC); engPutVariable(ep, "yC", yC); free(arrayTempxProcess); free(arrayTempyProcess); free(arrayTempxC); free(arrayTempyC); 放入NaNxProcess中,并填充yProcessxC

yC

现在麻烦了...现在,我试图获取结果...但函数printf("Entering MATLAB \n"); engEvalString(ep, "[xProcess,yProcess,xC, yC] = my_matlab_function(xProcess,yProcess,xC, yC);"); printf("Leaving MATLAB \n"); 在第一步中产生了我不理解的细分错误。

mxGetM(xC)

我曾尝试减少xC = engGetVariable(ep,"xC"); int mRowsC = mxGetM(xC); double *XC = NULL; XC = (double *)malloc (mRowsC*sizeof(double) ); memcpy(XC, mxGetData(xC),mRowsC*sizeof(double)); yC = engGetVariable(ep,"yC"); double *YC = NULL; YC = (double *)malloc (mmy*sizeof(double) ); memcpy(YC, mxGetData(yC),mmy*sizeof(double)); xProcess = engGetVariable(ep,"xProcess"); int mRowsProcess = mxGetM(xProcess); double *XPROCESS = NULL; XPROCESS = (double *)malloc (mRowsProcess*sizeof(double) ); memcpy(XPROCESS, mxGetData(xPROCESS),mRowsProcess*sizeof(double)); yProcess = engGetVariable(ep,"yProcess"); double *YPROCESS = NULL; PROCESS = (double *)malloc (mRowsProcess*sizeof(double) ); memcpy(YPROCESS, mxGetData(yProcess),mRowsProcess*sizeof(double)); numberC = mRowsC; mxDestroyArray(xProcess); mxDestroyArray(yProcess); mxDestroyArray(xC); mxDestroyArray(yC); free(XPROCESS); free(YPROCESS); free(XC); free(YC); } } xProcess中的元素数量,但是在第一时间之后的某个时间点出现了分割错误。 奇怪的是,我还尝试在yProcess之后将结果保存到Matlab中,但是没有成功。它什么也没保存。

我是将C和Matlab耦合的新手,所以我的代码可能完全错了,但是C不能与Matlab函数耦合有什么限制?

感谢您的帮助。谢谢!

0 个答案:

没有答案