Доступ к матрицам, хранящимся внутри массивов ячеек, с использованием файлов MEX в MATLAB

В настоящее время я пишу функцию MEX, которая должна будет работать с массивом ячеек в MATLAB. Файл MEX написан на C.

По сути, входными данными для моей функции будет массив ячеек, где каждая запись представляет собой числовую матрицу с реальными значениями. Простой пример:

C = cell(1,2);
C{1} = ones(10,10);
C{2} = zeros(10,4);

Я хотел бы иметь доступ к числовым массивам C{1} и C{2} в моем файле MEX. В идеале я хотел бы сделать это без необходимости создавать вторую копию данных в моем файле MEX (т.е. получать для них указатели).

Используя предыдущий пример, мой текущий подход выглядит следующим образом:

/* declare a pointer variable to the incoming cell array after it is passed to the MEX function */
mxArray C_CELL = (mxArray *) mxGetData(prhs[0]) 

/* declare  a 2 x 1 array of pointers to access the cell array in C */
double *myarray[2] //

/* point towards the contents of C_CELL */
myarray[0] = mxGetPr(C_CELL[0])
myarray[1] = mxGetPr(C_CELL[1])

К сожалению, это, похоже, приводит к ошибкам «недопустимое использование неопределенного типа« struct mxArray_tag »».


person Berk U.    schedule 16.04.2012    source источник
comment
«Недопустимое использование неопределенного типа» часто означает отсутствие файла заголовка, и вы даже не показали свои включения.   -  person Ben Voigt    schedule 16.04.2012


Ответы (2)


Много проблем в этом примере кода:

  • Вам не хватает точки с запятой в конце каждой строки
  • mxArray должны быть определены как указатели: например, mxArray *C_CELL.

Но, основываясь на сообщении об ошибке, которое вы получаете, я полагаю, что у вас есть правильные элементы в используемом вами источнике.

Ваша основная проблема заключается в том, что вы назначаете вывод mxGetData на mxArray *. Принцип работы mxGetData заключается в том, что он возвращает необработанный (void *) указатель на содержимое вашей матрицы. В этом случае ваша матрица содержит массив mxArray указателей с двумя уровнями перенаправления указателей.

Таким образом, C_CELL должен быть определен как mxArray **C_CELL. Обратите внимание, что выполнение этого без каких-либо проверок работоспособности или проверки границ быстро приведет к segfaults. Использование mxGetCell, как предлагает @David Heffernan, является более безопасным и надежным способ сделать это (при условии, что вы проверили, что ваш prhs[0] содержит массив ячеек).

person mbauman    schedule 16.04.2012

Вам нужно использовать mxGetCell для извлечения содержимого массива ячеек. .

mxArray *cellArray[2];
cellArray[0] = mxGetCell(prhs[0], 0);
cellArray[1] = mxGetCell(prhs[0], 1);
person David Heffernan    schedule 16.04.2012