X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Ffactor.c;h=f3933268431c646e70ed741fd74b7856567ab011;hb=a352ef204364d7b21036777ea40d6fa6046bae5f;hp=6fc106fd0551a73ceb4d148a5b94445e1f937ca4;hpb=6b351b28f47c1dfb1ce697eb50cd218b50122fd0;p=pspp diff --git a/src/language/stats/factor.c b/src/language/stats/factor.c index 6fc106fd05..f393326843 100644 --- a/src/language/stats/factor.c +++ b/src/language/stats/factor.c @@ -35,6 +35,7 @@ #include "language/lexer/lexer.h" #include "language/lexer/value-parser.h" #include "language/lexer/variable-parser.h" +#include "libpspp/cast.h" #include "libpspp/message.h" #include "libpspp/misc.h" #include "math/correlation.h" @@ -205,6 +206,8 @@ idata_free (struct idata *id) gsl_matrix_free (id->evec); if (id->cov != NULL) gsl_matrix_free (id->cov); + if (id->corr != NULL) + gsl_matrix_free (CONST_CAST (gsl_matrix *, id->corr)); free (id); } @@ -725,6 +728,7 @@ rotate (const struct cmd_factor *cf, const gsl_matrix *unrot, h_sqrt, normalised, 0.0, result); gsl_matrix_free (h_sqrt); + gsl_matrix_free (normalised); /* reflect negative sums and populate the rotated loadings vector*/ @@ -809,7 +813,6 @@ static bool run_factor (struct dataset *ds, const struct cmd_factor *factor); int cmd_factor (struct lexer *lexer, struct dataset *ds) { - bool extraction_seen = false; const struct dictionary *dict = dataset_dict (ds); struct cmd_factor factor; @@ -994,7 +997,6 @@ cmd_factor (struct lexer *lexer, struct dataset *ds) } else if (lex_match_id (lexer, "EXTRACTION")) { - extraction_seen = true; lex_match (lexer, T_EQUALS); while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH) { @@ -1733,12 +1735,14 @@ do_factor (const struct cmd_factor *factor, struct casereader *r) if (idata->cov == NULL) { msg (MW, _("The dataset contains no complete observations. No analysis will be performed.")); + covariance_destroy (cov); goto finish; } var_matrix = covariance_moments (cov, MOMENT_VARIANCE); mean_matrix = covariance_moments (cov, MOMENT_MEAN); idata->n = covariance_moments (cov, MOMENT_NONE); + if ( factor->method == METHOD_CORR) { @@ -1749,6 +1753,7 @@ do_factor (const struct cmd_factor *factor, struct casereader *r) else analysis_matrix = idata->cov; + if (factor->print & PRINT_DETERMINANT || factor->print & PRINT_KMO) { @@ -1896,13 +1901,16 @@ do_factor (const struct cmd_factor *factor, struct casereader *r) } show_correlation_matrix (factor, idata); + covariance_destroy (cov); { + gsl_matrix *am = matrix_dup (analysis_matrix); gsl_eigen_symmv_workspace *workspace = gsl_eigen_symmv_alloc (factor->n_vars); - gsl_eigen_symmv (matrix_dup (analysis_matrix), idata->eval, idata->evec, workspace); + gsl_eigen_symmv (am, idata->eval, idata->evec, workspace); gsl_eigen_symmv_free (workspace); + gsl_matrix_free (am); } gsl_eigen_symmv_sort (idata->eval, idata->evec, GSL_EIGEN_SORT_ABS_DESC); @@ -2014,6 +2022,8 @@ do_factor (const struct cmd_factor *factor, struct casereader *r) + gsl_matrix_free (factor_matrix); + gsl_vector_free (rotated_loadings); gsl_vector_free (initial_communalities); gsl_vector_free (extracted_communalities); }