/* Flags indicating that the first case has been seen */
bool pass_one_first_case_seen;
bool pass_two_first_case_seen;
+
+ gsl_matrix *unnormalised;
};
cov->cm = NULL;
cov->categoricals = cats;
+ cov->unnormalised = NULL;
return 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
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);
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);
}
}