X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fcovariance.c;h=f0161a54c529c59b187d840611e3cde134d45852;hb=b4a1fe2442a0b6fc8716e92574d33726d7170fe8;hp=dc3166923d7ddff670d903274caef1dfe548beb4;hpb=56c42d61d46aea9d13dcf55e9e2252805282570b;p=pspp diff --git a/src/math/covariance.c b/src/math/covariance.c index dc3166923d..f0161a54c5 100644 --- a/src/math/covariance.c +++ b/src/math/covariance.c @@ -68,7 +68,7 @@ struct covariance { /* The variables for which the covariance matrix is to be calculated. */ size_t n_vars; - const struct variable **vars; + const struct variable *const *vars; /* Categorical variables. */ struct categoricals *categoricals; @@ -131,11 +131,11 @@ covariance_moments (const struct covariance *cov, int m) /* Create a covariance struct. */ struct covariance * -covariance_1pass_create (size_t n_vars, const struct variable **vars, +covariance_1pass_create (size_t n_vars, const struct variable *const *vars, const struct variable *weight, enum mv_class exclude) { size_t i; - struct covariance *cov = xmalloc (sizeof *cov); + struct covariance *cov = xzalloc (sizeof *cov); cov->passes = 1; cov->state = 0; @@ -156,7 +156,8 @@ covariance_1pass_create (size_t n_vars, const struct variable **vars, cov->n_cm = (n_vars * (n_vars - 1) ) / 2; - cov->cm = xcalloc (sizeof *cov->cm, cov->n_cm); + if (cov->n_cm > 0) + cov->cm = xcalloc (sizeof *cov->cm, cov->n_cm); cov->categoricals = NULL; return cov; @@ -169,8 +170,8 @@ covariance_1pass_create (size_t n_vars, const struct variable **vars, until then. */ struct covariance * -covariance_2pass_create (size_t n_vars, const struct variable **vars, - size_t n_catvars, const struct variable **catvars, +covariance_2pass_create (size_t n_vars, const struct variable *const *vars, + size_t n_catvars, const struct variable *const *catvars, const struct variable *wv, enum mv_class exclude) { size_t i; @@ -266,6 +267,7 @@ get_val (const struct covariance *cov, int i, const struct ccase *c) return categoricals_get_binary_by_subscript (cov->categoricals, i - cov->n_vars, c); } +#if 0 void dump_matrix (const gsl_matrix *m) { @@ -278,6 +280,7 @@ dump_matrix (const gsl_matrix *m) printf ("\n"); } } +#endif /* Call this function for every case in the data set */ void @@ -598,7 +601,8 @@ covariance_calculate_single_pass (struct covariance *cov) const gsl_matrix * covariance_calculate (struct covariance *cov) { - assert ( cov->state > 0 ); + if ( cov->state <= 0 ) + return NULL; switch (cov->passes) { @@ -642,7 +646,6 @@ static const gsl_matrix * covariance_calculate_single_pass_unnormalized (struct covariance *cov) { size_t i, j; - size_t m; for (i = 0 ; i < cov->dim; ++i) { @@ -679,7 +682,8 @@ covariance_calculate_single_pass_unnormalized (struct covariance *cov) const gsl_matrix * covariance_calculate_unnormalized (struct covariance *cov) { - assert ( cov->state > 0 ); + if ( cov->state <= 0 ) + return NULL; switch (cov->passes) { @@ -694,6 +698,14 @@ covariance_calculate_unnormalized (struct covariance *cov) } } +/* Function to access the categoricals used by COV + The return value is owned by the COV +*/ +const struct categoricals * +covariance_get_categoricals (const struct covariance *cov) +{ + return cov->categoricals; +} /* Destroy the COV object */