Это проблема:
У меня есть код C, который создает массив nRows x 2
, называемый InitialArray
, заполненный случайными числами.Затем я разбил этот массив на две части, то есть первый столбец называется xProcess
, а второй столбец массива - yProcess
.Цель состоит в том, чтобы передать эти переменные, которые я создал (xProcess
и yProcess
), в Matlab, и там функция Matlab, основанная на правилах вероятностей, поместит NaN
в некоторые элементы xProcess
и yProcess
, и будетзаполните пустые массивы с именами xC
и yC
значениями xProcess
и yProcess
, прежде чем переходить к NaN
.Наконец, код C возвращает все четыре массива обратно, выполняет над ними некоторые операции и снова отправляет их в Matlab.Этот процесс повторяется для нескольких временных шагов.
Вот фрагмент кода:
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;
До сих пор я создал mxArray, и число случайных чисел, которые будутхранится в 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
и yC
, я создаю их как пустые.Я считаю, что это эквивалентно xC = []
и yC = []
в Matlab.И arrayTempyProcess
и arrayTempxProcess
- это временные массивы, каждый из которых получает столбец InitialArray
.
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);
Теперь функция Matlab помещает 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 после printf("Leaving MATLAB \n");
, но это не сработало.Это ничего не спасло.
Я новая связь C и Matlab, так что мой код может быть совершенно неверным, но есть ли ограничения, в которых C не может быть связан с функциями Matlab?
Любая помощьценится.Спасибо!