В документации igraph упоминается, что igraph_sparsemat_t
является тонкой оболочкой для библиотеки данных CXSparse .Документация для этой библиотеки - это, по сути, эта книга:
Но вы этого не делаетедействительно нужна книга, чтобы решить это.Вы можете немного покопаться в источнике и найти, что igraph_sparsemat_t
просто содержит cs_di_sparse
, то есть
typedef struct cs_di_sparse /* matrix in compressed-column or triplet form */
{
int nzmax ; /* maximum number of entries */
int m ; /* number of rows */
int n ; /* number of columns */
int *p ; /* column pointers (size n+1) or col indices (size nzmax) */
int *i ; /* row indices, size nzmax */
double *x ; /* numerical values, size nzmax */
int nz ; /* # of entries in triplet matrix, -1 for compressed-col */
} cs_di ;
Вы можете построить или прочитать это напрямую.
В документации igraph упоминается, чтоэто может содержать или представление CSC триплетной матрицы.Обратите внимание на это (см. Комментарий к последней записи).
Посмотрите на функции выделения / освобождения памяти в cs.h
(cs_di_malloc
/ cs_di_free
/ и т. Д.) И используйте их вместо себястандартный malloc / free, чтобы гарантировать, что совместимая free
используется в памяти, выделенной с определенным malloc
.
Обратите внимание, что интерфейс MATLAB в CSparse (взгляните на источники, которые я связал выше) такжеиспользует этот подход: он напрямую манипулирует структурой.
Наконец, обратите внимание, что igraph интерпретирует эту матрицу как CSC, а не CSR.Если вы конвертируете в структуру данных другой библиотеки, вам может понадобиться транспонировать.Если вы сделаете это, вам все равно придется конвертировать в (индекс, значение) пары.