Я пытаюсь выяснить, как получить доступ к матрице, которая хранится в поле в matlab структуре от функции mex.
Это ужасно длинно обветренный... Позвольте мне объяснить:
У меня есть matlab структура, которая была определена как следующее:
matrixStruct = struct('matrix', {4, 4, 4; 5, 5, 5; 6, 6 ,6})
У меня есть функция mex, в которой я хотел бы смочь получить указатель на первый элемент в матрице (матрица [0] [0], в терминах c), но я не мог выяснить, как сделать это.
Я попробовал следующее:
/* Pointer to the first element in the matrix (supposedly)... */
double *ptr = mxGetPr(mxGetField(prhs[0], 0, "matrix");
/* Incrementing the pointer to access all values in the matrix */
for(i = 0; i < 3; i++){
printf("%f\n", *(ptr + (i * 3)));
printf("%f\n", *(ptr + 1 + (i * 3)));
printf("%f\n", *(ptr + 2 + (i * 3)));
}
То, что это заканчивает тем, что печатало, следующее:
4.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
Я также попробовал изменения следующего, думая, что, возможно, это было что-то wonky с вызовами вложенной функции, но напрасно:
/* Pointer to the first location of the mxArray */
mxArray *fieldValuePtr = mxGetField(prhs[0], 0, "matrix");
/* Get the double pointer to the first location in the matrix */
double *ptr = mxGetPr(fieldValuePtr);
/* Same for loop code here as written above */
У кого-либо есть идея относительно того, как я могу достигнуть того, что я пытаюсь, или что я потенциально делаю неправильно?
Спасибо!
Править: Согласно комментарию гогота, я пытался делать подобные операции на структуре, которая имеет поле, названное массивом, который является одномерным массивом, удваивается.
Структура, содержащая массив, определяется следующим образом:
arrayStruct = struct('array', {4.44, 5.55, 6.66})
Я попробовал следование arrayStruct из функции mex:
mptr = mxGetPr(mxGetField(prhs[0], 0, "array"));
printf("%f\n", *(mptr));
printf("%f\n", *(mptr + 1));
printf("%f\n", *(mptr + 2));
... но вывод следовал за тем, что было распечатано ранее:
4.440000
0.000000
0.000000
Вы пытаетесь получить доступ к переменной, которая является массивом ячеек в MATLAB. Вы уверены, что данные хранятся последовательно? Что произойдет, если вы поместите двойной массив в структуру?
matrixStruct = struct('matrix', [4, 4, 4; 5, 5, 5; 6, 6 ,6])
Я думаю, что проблема в том, как MATLAB хранит данные в массиве ячеек. Попробуйте выполнить следующее:
double1 = 1;
double2 = 1:2;
cellempty = {[]};
celldouble1 = {1};
celldouble2 = {1:2};
cell2doubles = {1,2};
whos
Результат:
Name Size Bytes Class Attributes
cell2doubles 1x2 136 cell
celldouble1 1x1 68 cell
celldouble2 1x1 76 cell
cellempty 1x1 60 cell
double1 1x1 8 double
double2 1x2 16 double
Видно, что каждый элемент массива ячеек занимает дополнительные 60 байт к размеру чисел.
struct ('field', {abc})
- это особая форма конструктора структуры, которая создает массив struct того же размера, что и массив ячеек, помещая каждый элемент ячейку в поле 'field' соответствующего элемента структуры. То есть, это:
s = struct('field', {a b c});
дает тот же результат, что и этот:
s(1).field = a;
s(2).field = b;
s(3).field = c;
Решение вашей проблемы состоит в том, чтобы использовать квадратные скобки для формирования обычного (не состоящего из ячеек) массива, например:
matrixStruct = struct('matrix', [4, 4, 4; 5, 5, 5; 6, 6 ,6]);