X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=inline;f=src%2Flanguage%2Fstats%2Fmatrix.c;h=9bbc37f9a23e4c09ef72f052b46365b369648943;hb=ab90a86a87d3f006fbb362907b1c41110a117a79;hp=b1ec91474dbf88d0eda8fc9cd11172e85b17cf57;hpb=ff7ae14592cbdbebc4e4322424db95663ea7e166;p=pspp diff --git a/src/language/stats/matrix.c b/src/language/stats/matrix.c index b1ec91474d..9bbc37f9a2 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++) { @@ -7499,7 +7505,7 @@ matrix_get_execute__ (struct matrix_command *cmd, struct casereader *reader, error = true; } } - else if (var_is_num_missing (var, d, MV_USER)) + else if (var_is_num_missing (var, d) == MV_USER) { if (get->user.treatment == MGET_RECODE) d = get->user.substitute; @@ -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."), @@ -8222,7 +8228,7 @@ matrix_mget_commit_var (struct ccase **rows, size_t n_rows, { struct variable *var = dict_get_var (d, cs + x); double value = case_num (rows[y], var); - if (var_is_num_missing (var, value, MV_ANY)) + if (var_is_num_missing (var, value)) { n_missing++; value = 0.0; @@ -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. */