C и MATLAB: создание пустого массива в C вызывает функцию Matlab, чтобы заполнить его, заканчивается ошибкой - PullRequest
0 голосов
/ 14 ноября 2018

Это проблема:

У меня есть код 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?

Любая помощьценится.Спасибо!

...