[math] Unique columns as array for CSR sparse matrix

This commit is contained in:
Al
2016-01-09 01:40:26 -05:00
parent 023c04d78f
commit 2f1e2139ca
2 changed files with 48 additions and 1 deletions

View File

@@ -16,4 +16,49 @@ sparse_matrix_t *sparse_matrix_new_from_matrix(matrix_t *matrix) {
sparse_matrix_finalize_row(sparse);
}
return sparse;
}
}
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;
}

View File

@@ -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