这是问题所在
我有一个C代码,它创建一个填充有随机数的数组nRows x 2
,称为InitialArray
。然后,我将该数组分为两部分,即第一列称为xProcess
,第二列称为yProcess
。
目的是将我创建的这些变量(xProcess
和yProcess
传递给Matlab,在那里,基于概率规则的Matlab函数会将NaN
放在{{1}的某些元素中}和xProcess
,并在转到yProcess
之前用xC
和yC
的值填充名为xProcess
和yProcess
的空数组。
最后,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中的yC
和xC = []
。 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);
放入NaN
和xProcess
中,并填充yProcess
和xC
。
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函数耦合有什么限制?
感谢您的帮助。谢谢!