Как получить доступ к матрице в поле matlab структуры от функции mex?

Я пытаюсь выяснить, как получить доступ к матрице, которая хранится в поле в 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
6
задан B. Ruschill 11 May 2010 в 19:53
поделиться

2 ответа

Вы пытаетесь получить доступ к переменной, которая является массивом ячеек в 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 байт к размеру чисел.

1
ответ дан 17 December 2019 в 02:25
поделиться

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]);
5
ответ дан 17 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: