Доступ к разреженной матрице, созданной в MEX, из MATLAB

Я создал разреженную матрицу в MEX-файле, следуя примеру, показанному в здесь. Теперь, как мне получить доступ к этой матрице из MATLAB в целом.

#define NZMAX 4
#define ROWS  4
#define COLS  2

int            rows=ROWS, cols=COLS;
mxArray       *ptr_array; /* Pointer to created sparse array. */
static double  static_pr_data[NZMAX] = {5.8, 6.2, 5.9, 6.1};
static int     static_ir_data[NZMAX] = {0, 2, 1, 3};
static int     static_jc_data[COLS+1] = {0, 2, 4};
double        *start_of_pr;
int           *start_of_ir, *start_of_jc;
mxArray       *array_ptr;

/* Create a sparse array. */    
array_ptr = mxCreateSparse(rows, cols, NZMAX, mxREAL); 

/* Place pr data into the newly created sparse array. */ 
start_of_pr = (double *)mxGetPr(array_ptr); 
memcpy(start_of_pr, static_pr_data, NZMAX*sizeof(double));

/* Place ir data into the newly created sparse array. */ 
start_of_ir = (int *)mxGetIr(array_ptr); 
memcpy(start_of_ir, static_ir_data, NZMAX*sizeof(int));

/* Place jc data into the newly created sparse array. */ 
start_of_jc = (int *)mxGetJc(array_ptr); 
memcpy(start_of_jc, static_jc_data, NZMAX*sizeof(int));

/* ... Use the sparse array in some fashion. */
/* When finished with the mxArray, deallocate it. */
mxDestroyArray(array_ptr);

Также при сохранении значений в static_pr_data, ic_data и jc_data необходимо ли хранить значения в основном формате столбца? Можно ли хранить в основном формате строки (поскольку это ускорит мой расчет)?


person koder    schedule 27.05.2011    source источник
comment
Пожалуйста, разместите соответствующий код здесь вместо ссылки.   -  person PengOne    schedule 27.05.2011
comment
Прислушаюсь к твоему совету, Крис!   -  person koder    schedule 29.05.2011


Ответы (2)


В примере, на который вы ссылаетесь, последнее утверждение

mxDestroyArray(array_ptr);

Вместо уничтожения массива вам нужно вернуть его как результат вашей MEX-функции. Исходный код вашей MEX-функции C/C++ должен иметь функцию с именем mexFunction (точка входа для MEX-функции), которая выглядит следующим образом:

void mexFunction(int nlhs, mxArray * plhs[], int nrhs, const mxArray * prhs[])

Чтобы вернуть результат MEX-функции, назначьте его в массив plhs, например:

plhs[0] = array_ptr; // instead of mxDestroyArray(array_ptr);

Скомпилируйте код в MEX-функцию (назовем ее sparsetest). Вызовите его из MATLAB следующим образом:

>> output = sparsetest;

Теперь output — это переменная MATLAB, содержащая разреженную матрицу, которую вы создали в своей MEX-функции.

Что касается хранения данных в формате строк, это невозможно. MATLAB обрабатывает только разреженные матрицы по столбцам.

person SCFrench    schedule 28.05.2011
comment
когда я делаю вывод (1,1) или любой индекс, значение всегда равно 0! Фактические значения я не могу получить. В чем проблема? Я неправильно обращаюсь к значениям? - person koder; 30.05.2011
comment
Я решил свою проблему, я предположил, что значения в данных должны начинаться с индекса 1, но на самом деле он должен начинаться только с индексации 0... Спасибо за вашу помощь. - person koder; 30.05.2011

Совет по получению поля матрицы из структуры Matlab с использованием engGetVariable()

У меня есть структура с полем, которое является матрицей. Например, в C++ соответствующая структура является двойной**. Попытка получить доступ к полю с помощью engGetVariable(engine,MyStruct.theField) не удалась. Я использую временную переменную для хранения MyStruct.theField, а затем использую engGetVariable(engine, tempVar), и код для получения матричного поля из структуры выглядит так

// Fetch struct field using a temp variable
std::string tempName = std::string(field_name) + "_temp";
std::string fetchField = tempName + " = " + std::string(struct_name) 
        + "." + std::string(field_name) + "; ";
matlabExecute(ep, fetchField);
mxArray *matlabArray = engGetVariable(ep, tempName.c_str());

// Get variable elements
const int count = mxGetNumberOfElements(matlabArray);
T *data = (T*) mxGetData(matlabArray);
for (int i = 0; i < count; i++)
    vector[i] = _isnan(data[i]) ? (T) (int) -9999 : (T) data[i];

// Clear temp variable
std::string clearTempVar = "clear " + tempName + "; ";
matlabExecute(ep, clearTempVar);

// Destroy mx object
mxDestroyArray(matlabArray);
person kiriloff    schedule 13.11.2014