X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Ffactor.c;h=e83a6497b5a76984084bf90f47008b8004e8b641;hb=235b4e8bcc402940fe7e0a466d54341a36f5f801;hp=9480b3a17a8ccc9947891e24a521c64d0e31c2d3;hpb=cc62e6937ff0410a356682b5757cf99788faa888;p=pspp diff --git a/src/language/stats/factor.c b/src/language/stats/factor.c index 9480b3a17a..e83a6497b5 100644 --- a/src/language/stats/factor.c +++ b/src/language/stats/factor.c @@ -266,10 +266,6 @@ idata_free (struct idata *id) gsl_vector_free (id->msr); gsl_vector_free (id->eval); gsl_matrix_free (id->evec); - if (id->mm.cov != NULL) - gsl_matrix_free (id->mm.cov); - if (id->mm.corr != NULL) - gsl_matrix_free (CONST_CAST (gsl_matrix *, id->mm.corr)); free (id); } @@ -1009,7 +1005,7 @@ iterate_factor_matrix (const gsl_matrix *r, gsl_vector *communalities, gsl_matri static bool run_factor (struct dataset *ds, const struct cmd_factor *factor); -static void do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata); +static bool do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata); @@ -1471,6 +1467,12 @@ cmd_factor (struct lexer *lexer, struct dataset *ds) if (factor.n_vars < 2) msg (MW, _("Factor analysis on a single variable is not useful.")); + if (factor.n_vars < 1) + { + msg (ME, _("Factor analysis without variables is not possible.")); + goto error; + } + if (matrix_reader) { struct idata *id = idata_alloc (factor.n_vars); @@ -1480,7 +1482,9 @@ cmd_factor (struct lexer *lexer, struct dataset *ds) { do_factor_by_matrix (&factor, id); + gsl_matrix_free (id->mm.corr); id->mm.corr = NULL; + gsl_matrix_free (id->mm.cov); id->mm.cov = NULL; } @@ -1556,14 +1560,14 @@ the_communality (const gsl_matrix *evec, const gsl_vector *eval, int n, int n_fa /* Return the communality of variable N, calculated to N_FACTORS */ static double -communality (struct idata *idata, int n, int n_factors) +communality (const struct idata *idata, int n, int n_factors) { return the_communality (idata->evec, idata->eval, n, n_factors); } static void -show_scree (const struct cmd_factor *f, struct idata *idata) +show_scree (const struct cmd_factor *f, const struct idata *idata) { struct scree *s; const char *label ; @@ -1648,7 +1652,7 @@ show_communalities (const struct cmd_factor * factor, static void -show_factor_matrix (const struct cmd_factor *factor, struct idata *idata, const char *title, const gsl_matrix *fm) +show_factor_matrix (const struct cmd_factor *factor, const struct idata *idata, const char *title, const gsl_matrix *fm) { int i; @@ -1741,7 +1745,8 @@ show_factor_matrix (const struct cmd_factor *factor, struct idata *idata, const static void -show_explained_variance (const struct cmd_factor * factor, struct idata *idata, +show_explained_variance (const struct cmd_factor * factor, + const struct idata *idata, const gsl_vector *initial_eigenvalues, const gsl_vector *extracted_eigenvalues, const gsl_vector *rotated_loadings) @@ -2215,13 +2220,22 @@ do_factor (const struct cmd_factor *factor, struct casereader *r) do_factor_by_matrix (factor, idata); finish: + gsl_matrix_free (idata->mm.corr); + gsl_matrix_free (idata->mm.cov); + idata_free (idata); casereader_destroy (r); } -static void +static bool do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata) { + if (!idata->mm.cov && !idata->mm.corr) + { + msg (ME, _("The dataset has no complete covariance or correlation matrix.")); + return false; + } + if (idata->mm.cov && !idata->mm.corr) idata->mm.corr = correlation_from_covariance (idata->mm.cov, idata->mm.var_matrix); if (idata->mm.corr && !idata->mm.cov)