diff --git a/src/sparse_matrix_utils.c b/src/sparse_matrix_utils.c index 44c6ed86..fa87ef0d 100644 --- a/src/sparse_matrix_utils.c +++ b/src/sparse_matrix_utils.c @@ -16,4 +16,49 @@ sparse_matrix_t *sparse_matrix_new_from_matrix(matrix_t *matrix) { sparse_matrix_finalize_row(sparse); } return sparse; -} \ No newline at end of file +} + + +bool sparse_matrix_add_unique_columns(sparse_matrix_t *matrix, khash_t(int_set) *unique_columns, uint32_array *array) { + size_t n = matrix->indices->n; + uint32_t *indices = matrix->indices->a; + + kh_clear(int_set, unique_columns); + + size_t i; + + for (i = 0; i < n; i++) { + uint32_t col = indices[i]; + + int ret; + kh_put(int_set, unique_columns, (khint_t)col, &ret); + if (ret < 0) { + return false; + } + } + + uint32_array_clear(array); + uint32_array_resize(array, kh_size(unique_columns)); + + khint_t k; + + kh_foreach_key(unique_columns, k, { + uint32_array_push(array, (uint32_t)k); + }) + + return true; +} + +uint32_array *sparse_matrix_unique_columns(sparse_matrix_t *matrix) { + khash_t(int_set) *unique_columns = kh_init(int_set); + uint32_array *ret = uint32_array_new(); + + if (sparse_matrix_add_unique_columns(matrix, unique_columns, ret)) { + kh_destroy(int_set, unique_columns); + return ret; + } + + kh_destroy(int_set, unique_columns); + uint32_array_destroy(ret); + return NULL; +} diff --git a/src/sparse_matrix_utils.h b/src/sparse_matrix_utils.h index 27971b12..c19c3b21 100644 --- a/src/sparse_matrix_utils.h +++ b/src/sparse_matrix_utils.h @@ -7,5 +7,7 @@ #include "matrix.h" sparse_matrix_t *sparse_matrix_new_from_matrix(matrix_t *matrix); +uint32_array *sparse_matrix_unique_columns(sparse_matrix_t *matrix); +bool sparse_matrix_add_unique_columns(sparse_matrix_t *matrix, khash_t(int_set) *unique_columns, uint32_array *array); #endif \ No newline at end of file