X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fcovariance.c;h=3ec90efbba05188c68bddd54ce53bc2a8e7a5d0f;hb=2d82411f69f2a87a04ed22de78717bacf7d342de;hp=9bc8eb72e7515a7ba2f3cb9042f315fe049e6877;hpb=ce4f35416abc94c3c4d39312da42b9fff0788073;p=pspp diff --git a/src/math/covariance.c b/src/math/covariance.c index 9bc8eb72e7..3ec90efbba 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_binary_by_subscript (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); @@ -742,7 +750,9 @@ struct tab_table * covariance_dump_enc_header (const struct covariance *cov, int length) { struct tab_table *t = tab_create (cov->dim, length); + int n; int i; + tab_title (t, "Covariance Encoding"); tab_box (t, @@ -758,18 +768,19 @@ covariance_dump_enc_header (const struct covariance *cov, int length) tab_vline (t, TAL_1, i + 1, 0, tab_nr (t) - 1); } - int n = 0; + n = 0; while (i < cov->dim) { struct string str; int idx = i - cov->n_vars; const struct interaction *iact = categoricals_get_interaction_by_subscript (cov->categoricals, idx); + int df; ds_init_empty (&str); interaction_to_string (iact, &str); - int df = categoricals_df (cov->categoricals, n); + df = categoricals_df (cov->categoricals, n); tab_joint_text (t, i, 0, @@ -802,6 +813,6 @@ covariance_dump_enc (const struct covariance *cov, const struct ccase *c, for (i = 0 ; i < cov->dim; ++i) { double v = get_val (cov, i, c); - tab_double (t, i, row, 0, v, i < cov->n_vars ? NULL : &F_8_0); + tab_double (t, i, row, 0, v, i < cov->n_vars ? NULL : &F_8_0, RC_OTHER); } }