67 lines
1.7 KiB
C
67 lines
1.7 KiB
C
#include "sparse_matrix_utils.h"
|
|
#include "float_utils.h"
|
|
#include "matrix.h"
|
|
|
|
|
|
sparse_matrix_t *sparse_matrix_new_from_matrix(double_matrix_t *matrix) {
|
|
sparse_matrix_t *sparse = sparse_matrix_new_shape(matrix->m, matrix->n);
|
|
|
|
for (size_t i = 0; i < matrix->m; i++) {
|
|
for (size_t j = 0; j < matrix->n; j++) {
|
|
double value = double_matrix_get(matrix, i, j);
|
|
if (!double_equals(value, 0.0)) {
|
|
sparse_matrix_append(sparse, j, value);
|
|
}
|
|
}
|
|
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);
|
|
if (!uint32_array_resize(array, kh_size(unique_columns))) {
|
|
return false;
|
|
}
|
|
|
|
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;
|
|
}
|