X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fmatrix.c;h=9bbc37f9a23e4c09ef72f052b46365b369648943;hb=80ff0f10da00eae4c7b3b07266a03e403e97d640;hp=64d8dd92f83873465a0727415c1604c3843a452c;hpb=339f1956cc727eda788638644ef93ab7852b31cd;p=pspp diff --git a/src/language/stats/matrix.c b/src/language/stats/matrix.c index 64d8dd92f8..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. @@ -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; @@ -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;