2013-03-01 2 views
2

У меня есть структура из Matlab, переданная в mex. Он передан правильно, я проверил его с mxGetClassName (mxArray_pointer_carrying_struct), который возвращает struct как тип класса. Структура имеет 15 полей n соответствующих свойств, все 30 строк (15 свойств_значений, 15 свойств_значений).Доступ к Matlab Struct из mex

Я могу получить доступ к именам свойств, используя mxGetFieldNameByNumber (mxArray_pointer_carrying_struct, index);

Как получить доступ к значениям свойств?

код я должен сделать выше выглядит, как показано ниже:

extract_settings(const mxArray *p) 
{ 
    mwIndex j = 1; 
    const char *property; 
    mexPrintf("\nInput Arg %i is of type:%s\n",j,mxGetClassName(p)); 
    for(int i = 0;i<=14;i++) 
    { 
     property = mxGetFieldNameByNumber(p, i); %gets property names 
     mexPrintf("%s-- \n",property); %Displays 15 property names 
    } 
} 

Моя структура выглядит, как показано ниже:

{ 
TRIGGER_POLARITY : LEVEL_LOW 
EDGE : EDGE_RISING 
. 
. 
. (15 elements as of now) 
} 
+0

u может получить значение также аналогичным образом, как и у, с собственностью. Как только вы получите строку для значения, вы можете преобразовать ее в числовой эквивалент (только для числовых значений), используя atoi() или strtoul() перед ее печатью. –

+0

Не могли бы вы указать, какой mxCommand он будет? Поскольку значения представляют собой строки, мне не понадобится atoi(); – sridutt

ответ

5

Вы, вероятно, ищет mxGetFieldByNumber. Также есть полный пример передачи структур в файлы MEX, поставляемые с MATLAB, см. this documentation from Mathworks. Вы можете загрузить пример в MATLAB следующим образом:

edit([matlabroot '/extern/examples/refbook/phonebook.c']); 

EDIT: Там также mxGetField, который позволяет получить доступ к полю, используя его имя.

EDIT2: Чтобы преобразовать результат из mxGetField в строку C, вы можете использовать mxArrayToString. Обратите внимание, что вам нужно освободить память строки после ее использования. Вы можете использовать mxIsChar, чтобы проверить, содержит ли поле массив символов MATLAB.

+0

mxArray * tmp = mxGetFieldByNumber (p, 0, i); mexPrintf ("% s \ n", (char *) mxGetData (mxDuplicateArray (tmp))); Я добавил это в цикл for выше, он получает первые символы значений Ex: L, E ... Вы видите какие-либо проблемы в моем коде выше. – sridutt

+0

'mxGetData' для реальных данных. Я обновил свой ответ с информацией о строках. Пожалуйста, взгляните на примеры, представленные в MATLAB, они действительно полезны и охватывают многие основные вещи. –

Смежные вопросы