X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fmatrix.c;h=8a08740183a54f72dba21798abae29d9fa42d6c1;hb=d3c96903451307e60d1d4a680ecf58c86cac7eaa;hp=b1ec91474dbf88d0eda8fc9cd11172e85b17cf57;hpb=ff7ae14592cbdbebc4e4322424db95663ea7e166;p=pspp diff --git a/src/language/stats/matrix.c b/src/language/stats/matrix.c index b1ec91474d..8a08740183 100644 --- a/src/language/stats/matrix.c +++ b/src/language/stats/matrix.c @@ -1851,21 +1851,24 @@ matrix_eval_IDENT (double s1, double s2) return m; } +/* Inverts X, storing the inverse into INVERSE. As a side effect, replaces X + by its LU decomposition. */ static void -invert_matrix (gsl_matrix *x) +invert_matrix (gsl_matrix *x, gsl_matrix *inverse) { gsl_permutation *p = gsl_permutation_alloc (x->size1); int signum; gsl_linalg_LU_decomp (x, p, &signum); - gsl_linalg_LU_invx (x, p); + gsl_linalg_LU_invert (x, p, inverse); gsl_permutation_free (p); } static gsl_matrix * -matrix_eval_INV (gsl_matrix *m) +matrix_eval_INV (gsl_matrix *src) { - invert_matrix (m); - return m; + gsl_matrix *dst = gsl_matrix_alloc (src->size1, src->size2); + invert_matrix (src, dst); + return dst; } static gsl_matrix * @@ -3405,7 +3408,10 @@ matrix_expr_evaluate_exp_mat (const struct matrix_expr *e, mul_matrix (&y, x, y, &t); if (bf < 0) - invert_matrix (y); + { + invert_matrix (y, x); + swap_matrix (&x, &y); + } /* Garbage collection. @@ -6148,7 +6154,7 @@ save_file_open (struct save_file *sf, gsl_matrix *m, struct stringi_set strings; stringi_set_clone (&strings, &sf->strings); - for (size_t i = 0; dict_get_var_cnt (dict) < m->size2; i++) + for (size_t i = 0; dict_get_n_vars (dict) < m->size2; i++) { char tmp_name[64]; const char *name; @@ -7431,7 +7437,7 @@ matrix_get_execute__ (struct matrix_command *cmd, struct casereader *reader, } else { - n_vars = dict_get_var_cnt (dict); + n_vars = dict_get_n_vars (dict); vars = xnmalloc (n_vars, sizeof *vars); for (size_t i = 0; i < n_vars; i++) { @@ -7545,7 +7551,7 @@ matrix_open_casereader (const struct matrix_command *cmd, } else { - if (dict_get_var_cnt (dataset_dict (dataset)) == 0) + if (dict_get_n_vars (dataset_dict (dataset)) == 0) { msg_at (ME, cmd->location, _("The %s command cannot read an empty active file."), @@ -8286,13 +8292,13 @@ matrix_mget_execute__ (struct matrix_command *cmd, struct casereader *r, _("ROWTYPE_ must precede VARNAME_ in matrix data file.")); return; } - if (var_get_dict_index (varname_) + 1 >= dict_get_var_cnt (d)) + if (var_get_dict_index (varname_) + 1 >= dict_get_n_vars (d)) { msg_at (SE, loc, _("Matrix data file contains no continuous variables.")); return; } - for (size_t i = 0; i < dict_get_var_cnt (d); i++) + for (size_t i = 0; i < dict_get_n_vars (d); i++) { const struct variable *v = dict_get_var (d, i); if (v != rowtype_ && v != varname_ && var_get_width (v) != 0) @@ -8318,7 +8324,7 @@ matrix_mget_execute__ (struct matrix_command *cmd, struct casereader *r, /* Continuous variables. */ size_t cs = var_get_dict_index (varname_) + 1; - size_t cn = dict_get_var_cnt (d) - cs; + size_t cn = dict_get_n_vars (d) - cs; struct ccase *cc = NULL; /* Pivot table. */