X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Ffactor.c;h=3c1ce6094e5a2854be019066efdffae0e6afa618;hb=2306be110627785f25c99bff9dae464c693922d9;hp=bdfc9ae290c8b29549eff6a9d7b33e5a76daafa4;hpb=5164eb1bfa0527dcb32248fb1fc7db55c2bcc94c;p=pspp diff --git a/src/language/stats/factor.c b/src/language/stats/factor.c index bdfc9ae290..3c1ce6094e 100644 --- a/src/language/stats/factor.c +++ b/src/language/stats/factor.c @@ -45,7 +45,6 @@ #include "math/correlation.h" #include "math/covariance.h" #include "math/moments.h" -#include "output/chart-item.h" #include "output/charts/scree.h" #include "output/pivot-table.h" @@ -251,7 +250,7 @@ struct idata static struct idata * idata_alloc (size_t n_vars) { - struct idata *id = xzalloc (sizeof (*id)); + struct idata *id = XZALLOC (struct idata); id->n_extractions = 0; id->msr = gsl_vector_alloc (n_vars); @@ -1146,8 +1145,9 @@ cmd_factor (struct lexer *lexer, struct dataset *ds) if (! lex_force_match (lexer, T_RPAREN)) goto error; - mr = create_matrix_reader_from_case_reader (dict, matrix_reader, - &factor.vars, &factor.n_vars); + mr = matrix_reader_create (dict, matrix_reader); + factor.vars = xmemdup (mr->cvars, mr->n_cvars * sizeof *mr->cvars); + factor.n_vars = mr->n_cvars; } else { @@ -1178,6 +1178,13 @@ cmd_factor (struct lexer *lexer, struct dataset *ds) free (factor.vars); factor.vars = vars; factor.n_vars = n_vars; + + if (mr) + { + free (mr->cvars); + mr->cvars = xmemdup (vars, n_vars * sizeof *vars); + mr->n_cvars = n_vars; + } } else if (lex_match_id (lexer, "PLOT")) { @@ -1315,7 +1322,7 @@ cmd_factor (struct lexer *lexer, struct dataset *ds) else if (lex_match_id (lexer, "ITERATE")) { if (lex_force_match (lexer, T_LPAREN) - && lex_force_int (lexer)) + && lex_force_int_range (lexer, "ITERATE", 0, INT_MAX)) { n_iterations = lex_integer (lexer); lex_get (lexer); @@ -1528,8 +1535,7 @@ cmd_factor (struct lexer *lexer, struct dataset *ds) { struct idata *id = idata_alloc (factor.n_vars); - while (next_matrix_from_reader (&id->mm, mr, - factor.vars, factor.n_vars)) + while (matrix_reader_next (&id->mm, mr, NULL)) { do_factor_by_matrix (&factor, id); @@ -1537,10 +1543,8 @@ cmd_factor (struct lexer *lexer, struct dataset *ds) id->ai_cov = NULL; gsl_matrix_free (id->ai_cor); id->ai_cor = NULL; - gsl_matrix_free (id->mm.corr); - id->mm.corr = NULL; - gsl_matrix_free (id->mm.cov); - id->mm.cov = NULL; + + matrix_material_uninit (&id->mm); } idata_free (id); @@ -1549,13 +1553,12 @@ cmd_factor (struct lexer *lexer, struct dataset *ds) if (! run_factor (ds, &factor)) goto error; - - destroy_matrix_reader (mr); + matrix_reader_destroy (mr); free (factor.vars); return CMD_SUCCESS; error: - destroy_matrix_reader (mr); + matrix_reader_destroy (mr); free (factor.vars); return CMD_FAILURE; } @@ -1750,7 +1753,6 @@ show_explained_variance (const struct cmd_factor * factor, struct pivot_table *table = pivot_table_create ( N_("Total Variance Explained")); - table->look.omit_empty = true; pivot_dimension_create (table, PIVOT_AXIS_COLUMN, N_("Statistics"), N_("Total"), PIVOT_RC_OTHER, @@ -1943,8 +1945,11 @@ show_correlation_matrix (const struct cmd_factor *factor, const struct idata *id } if (factor->print & PRINT_DETERMINANT) - table->caption = pivot_value_new_user_text_nocopy ( - xasprintf ("%s: %.2f", _("Determinant"), idata->detR)); + { + struct pivot_value *caption = pivot_value_new_user_text_nocopy ( + xasprintf ("%s: %.2f", _("Determinant"), idata->detR)); + pivot_table_set_caption (table, caption); + } pivot_table_submit (table); } @@ -2009,9 +2014,10 @@ do_factor (const struct cmd_factor *factor, struct casereader *r) static void do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata) { - if (!idata->mm.cov && !idata->mm.corr) + if (!idata->mm.cov && !(idata->mm.corr && idata->mm.var_matrix)) { - msg (ME, _("The dataset has no complete covariance or correlation matrix.")); + msg (ME, _("The dataset has no covariance matrix or a " + "correlation matrix along with standard devications.")); return; } @@ -2059,7 +2065,8 @@ do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata) gsl_matrix_free (tmp); } - if (factor->print & PRINT_UNIVARIATE) + if (factor->print & PRINT_UNIVARIATE + && idata->mm.n && idata->mm.mean_matrix && idata->mm.var_matrix) { struct pivot_table *table = pivot_table_create ( N_("Descriptive Statistics")); @@ -2093,7 +2100,7 @@ do_factor_by_matrix (const struct cmd_factor *factor, struct idata *idata) pivot_table_submit (table); } - if (factor->print & PRINT_KMO) + if (factor->print & PRINT_KMO && idata->mm.n) { struct pivot_table *table = pivot_table_create ( N_("KMO and Bartlett's Test"));