X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fcovariance.c;h=c28dcb0358d41663be1c3cbe8efb03b799b8ad76;hb=refs%2Fbuilds%2F20140228030505%2Fpspp;hp=bc5382c0c12752e899c5b7b6570f16acf7ae4c11;hpb=6e5736d55e61f5dca727428213a835998eeacead;p=pspp diff --git a/src/math/covariance.c b/src/math/covariance.c index bc5382c0c1..c28dcb0358 100644 --- a/src/math/covariance.c +++ b/src/math/covariance.c @@ -113,6 +113,8 @@ struct covariance /* Flags indicating that the first case has been seen */ bool pass_one_first_case_seen; bool pass_two_first_case_seen; + + gsl_matrix *unnormalised; }; @@ -202,6 +204,7 @@ covariance_2pass_create (size_t n_vars, const struct variable *const *vars, cov->cm = NULL; cov->categoricals = cats; + cov->unnormalised = NULL; return cov; } @@ -268,7 +271,7 @@ get_val (const struct covariance *cov, int i, const struct ccase *c) return val->f; } - return categoricals_get_code_for_case (cov->categoricals, i - cov->n_vars, c); + return categoricals_get_effects_code_for_case (cov->categoricals, i - cov->n_vars, c); } #if 0 @@ -667,27 +670,31 @@ covariance_calculate_single_pass_unnormalized (struct covariance *cov) /* 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. + returned matrix is owned by the structure, and must not be freed. Call this function only after all data have been accumulated. */ -gsl_matrix * +const gsl_matrix * covariance_calculate_unnormalized (struct covariance *cov) { if ( cov->state <= 0 ) return NULL; + if (cov->unnormalised != NULL) + return cov->unnormalised; + switch (cov->passes) { case 1: - return covariance_calculate_single_pass_unnormalized (cov); + cov->unnormalised = covariance_calculate_single_pass_unnormalized (cov); break; case 2: - return covariance_calculate_double_pass_unnormalized (cov); + cov->unnormalised = covariance_calculate_double_pass_unnormalized (cov); break; default: NOT_REACHED (); } + + return cov->unnormalised; } /* Function to access the categoricals used by COV @@ -711,6 +718,7 @@ covariance_destroy (struct covariance *cov) for (i = 0; i < n_MOMENTS; ++i) gsl_matrix_free (cov->moments[i]); + gsl_matrix_free (cov->unnormalised); free (cov->moments); free (cov->cm); free (cov);