См. Эту страницу на 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. Это должно добавить к веселью.