X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fcovariance.c;h=446ee6621a1e11881c37e5dba04d8d645c1610a8;hb=81579d9e9f994fb2908f50af41c3eb033d216e58;hp=f0161a54c529c59b187d840611e3cde134d45852;hpb=b4a1fe2442a0b6fc8716e92574d33726d7170fe8;p=pspp-builds.git diff --git a/src/math/covariance.c b/src/math/covariance.c index f0161a54..446ee662 100644 --- a/src/math/covariance.c +++ b/src/math/covariance.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,15 +16,18 @@ #include -#include -#include "covariance.h" -#include -#include "moments.h" +#include "math/covariance.h" + #include -#include -#include -#include -#include "categoricals.h" + +#include "data/case.h" +#include "data/variable.h" +#include "libpspp/assertion.h" +#include "libpspp/misc.h" +#include "math/categoricals.h" +#include "math/moments.h" + +#include "gl/xalloc.h" #define n_MOMENTS (MOMENT_VARIANCE + 1) @@ -171,7 +174,7 @@ covariance_1pass_create (size_t n_vars, const struct variable *const *vars, */ struct covariance * covariance_2pass_create (size_t n_vars, const struct variable *const *vars, - size_t n_catvars, const struct variable *const *catvars, + struct categoricals *cats, const struct variable *wv, enum mv_class exclude) { size_t i; @@ -197,7 +200,7 @@ covariance_2pass_create (size_t n_vars, const struct variable *const *vars, cov->n_cm = -1; cov->cm = NULL; - cov->categoricals = categoricals_create (catvars, n_catvars, wv, exclude); + cov->categoricals = cats; return cov; } @@ -296,7 +299,8 @@ covariance_accumulate_pass1 (struct covariance *cov, const struct ccase *c) cov->state = 1; } - categoricals_update (cov->categoricals, c); + if (cov->categoricals) + categoricals_update (cov->categoricals, c); for (i = 0 ; i < cov->dim; ++i) { @@ -342,8 +346,11 @@ covariance_accumulate_pass2 (struct covariance *cov, const struct ccase *c) assert (cov->state == 1); cov->state = 2; - cov->dim = cov->n_vars + - categoricals_total (cov->categoricals) - categoricals_get_n_variables (cov->categoricals); + cov->dim = cov->n_vars; + + if (cov->categoricals) + cov->dim += categoricals_total (cov->categoricals) + - categoricals_get_n_variables (cov->categoricals); cov->n_cm = (cov->dim * (cov->dim - 1) ) / 2; cov->cm = xcalloc (sizeof *cov->cm, cov->n_cm); @@ -355,7 +362,8 @@ covariance_accumulate_pass2 (struct covariance *cov, const struct ccase *c) cov->moments[i] = resize_matrix (cov->moments[i], cov->dim); } - categoricals_done (cov->categoricals); + if (cov->categoricals) + categoricals_done (cov->categoricals); /* Populate the moments matrices with the categorical value elements */ for (i = cov->n_vars; i < cov->dim; ++i) @@ -524,7 +532,7 @@ cm_to_gsl (struct covariance *cov) } -static const gsl_matrix * +static gsl_matrix * covariance_calculate_double_pass (struct covariance *cov) { size_t i, j; @@ -548,7 +556,7 @@ covariance_calculate_double_pass (struct covariance *cov) return cm_to_gsl (cov); } -static const gsl_matrix * +static gsl_matrix * covariance_calculate_single_pass (struct covariance *cov) { size_t i, j; @@ -593,12 +601,12 @@ covariance_calculate_single_pass (struct covariance *cov) } -/* - Return a pointer to gsl_matrix containing the pairwise covariances. - The matrix remains owned by the COV object, and must not be freed. - Call this function only after all data have been accumulated. -*/ -const gsl_matrix * +/* Return a pointer to gsl_matrix containing the pairwise covariances. The + caller owns the returned matrix and must free it when it is no longer + needed. + + Call this function only after all data have been accumulated. */ +gsl_matrix * covariance_calculate (struct covariance *cov) { if ( cov->state <= 0 ) @@ -620,7 +628,7 @@ covariance_calculate (struct covariance *cov) /* Covariance computed without dividing by the sample size. */ -static const gsl_matrix * +static gsl_matrix * covariance_calculate_double_pass_unnormalized (struct covariance *cov) { size_t i, j; @@ -642,7 +650,7 @@ covariance_calculate_double_pass_unnormalized (struct covariance *cov) return cm_to_gsl (cov); } -static const gsl_matrix * +static gsl_matrix * covariance_calculate_single_pass_unnormalized (struct covariance *cov) { size_t i, j; @@ -674,12 +682,12 @@ covariance_calculate_single_pass_unnormalized (struct covariance *cov) } -/* - Return a pointer to gsl_matrix containing the pairwise covariances. - The matrix remains owned by the COV object, and must not be freed. - Call this function only after all data have been accumulated. -*/ -const gsl_matrix * +/* Return a pointer to gsl_matrix containing the pairwise covariances. The + caller owns the returned matrix and must free it when it is no longer + needed. + + Call this function only after all data have been accumulated. */ +gsl_matrix * covariance_calculate_unnormalized (struct covariance *cov) { if ( cov->state <= 0 )