X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fdata%2Fcategory.c;h=33078ce2b45528c1cd518e89fb7c798ae44334b6;hb=685407ad62911e5edb1ec093a01ec9e46563af44;hp=b0424d9f65c054df4631897702d33ab4eae1c57a;hpb=9a12eb1d5baf9c8fc25d8e6bf1ec5c852ac840d0;p=pspp-builds.git diff --git a/src/data/category.c b/src/data/category.c index b0424d9f..33078ce2 100644 --- a/src/data/category.c +++ b/src/data/category.c @@ -41,7 +41,7 @@ #include "xalloc.h" -#define CAT_VALUE_NOT_FOUND -2 +#define CAT_VALUE_NOT_FOUND -1 #define N_INITIAL_CATEGORIES 1 @@ -58,6 +58,11 @@ struct cat_vals track of the number of values stored. */ + size_t *value_counts; /* Element i stores the number of cases for which + the categorical variable has that corresponding + value. This is necessary for computing covariance + matrices. + */ }; void @@ -70,6 +75,7 @@ cat_stored_values_create (const struct variable *v) obs_vals->n_categories = 0; obs_vals->n_allocated_categories = N_INITIAL_CATEGORIES; obs_vals->vals = xnmalloc (N_INITIAL_CATEGORIES, sizeof *obs_vals->vals); + obs_vals->value_counts = xnmalloc (N_INITIAL_CATEGORIES, sizeof *obs_vals->value_counts); var_set_obs_vals (v, obs_vals); } } @@ -80,7 +86,10 @@ cat_stored_values_destroy (struct cat_vals *obs_vals) if (obs_vals != NULL) { if (obs_vals->n_allocated_categories > 0) - free (obs_vals->vals); + { + free (obs_vals->vals); + free (obs_vals->value_counts); + } free (obs_vals); } } @@ -108,15 +117,17 @@ cat_value_find (const struct variable *v, const union value *val) } /* - Add the new value unless it is already present. + Add the new value unless it is already present. Increment the count. */ void cat_value_update (const struct variable *v, const union value *val) { if (var_is_alpha (v)) { + size_t i; struct cat_vals *cv = var_get_obs_vals (v); - if (cat_value_find (v, val) == CAT_VALUE_NOT_FOUND) + i = cat_value_find (v, val); + if (i == CAT_VALUE_NOT_FOUND) { if (cv->n_categories >= cv->n_allocated_categories) { @@ -124,10 +135,17 @@ cat_value_update (const struct variable *v, const union value *val) cv->vals = xnrealloc (cv->vals, cv->n_allocated_categories, sizeof *cv->vals); + cv->value_counts = xnrealloc (cv->value_counts, cv->n_allocated_categories, + sizeof *cv->value_counts); } cv->vals[cv->n_categories] = *val; + cv->value_counts[cv->n_categories] = 1; cv->n_categories++; } + else + { + cv->value_counts[i]++; + } } }