Создание разреженной матрицы в MEX - PullRequest
6 голосов
/ 23 мая 2011

Как создать 2d разреженную матрицу в MEX-файле, написанном на C. После создания матрицы, как получить доступ к элементам индивидуально, как в C, скажем mat[i][j]?

Я устал с помощью mxCreateNumericArray функция, но я не смог получить доступ к элементам, а также сделать его в виде разреженной матрицы.

Пожалуйста, помогите

1 Ответ

10 голосов
/ 23 мая 2011

См. Эту страницу на mxCreateSparse. Тогда вам нужно взглянуть на mxSetPr , mxSetIr и mxSetJc и соответствующие " получить "версии.

Вот пример того, как выделить разреженную матрицу. Я понимаю, что это старая ссылка, но, насколько мне известно, она не изменилась.

По сути, как это работает состоит в том, что данные ir содержат индексы строк. Данные jr содержат список индексов в массиве ir. Например, в ссылке о том, как выделить разреженную матрицу, код:

...
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};
...

массив static_jc_data сообщает, что индексы с static_jc_data[c] по static_jc_data[c+1]-1 из static_pr_data и static_ir_data соответствуют столбцу c матрицы. В пределах этого диапазона (от static_jc_data[c] до static_jc_data[c+1]-1) записи static_pr_data дают значения в матрице, а static_ir_data - правильные строки.

Например, матрица здесь будет:

A = [ 5.8  0
      0    5.9
      6.2  0
      0    6.1];

Чтобы ответить на ваши вопросы о том, как получить доступ к элементам по отдельности, вам нужно выяснить, существует ли i,j-й элемент и возвращает ли он его, в противном случае вернуть 0. Для этого вам нужно будет выполнить поиск по static_ir_data[static_jc_data[j]] до static_ir_data[static_jc_data[j+1]-1], чтобы увидеть, существует ли ваш i. Если это так, то соответствующая запись в static_pr_data будет содержать вашу запись. Если это не так, верните 0.

Однако, как правило, при разреженном использовании матрицы, если вы много ищете в матрице, чтобы увидеть, существует ли определенный элемент, вы можете подумать о том, как вы его используете. Как правило, гораздо лучше выполнять любую операцию, которую вы выполняете, только просматривая ненулевые элементы один раз вместо поиска каждой i,j -ой записи.

О, и еще одна вещь. Имейте в виду, что в коде MEX все ваши индексы основаны на 0, но они равны 1 в MATLAB. Это должно добавить к веселью.

...