matrix: Avoid gsl_linalg_LU_invx() because it was new in GSL 2.6.
[pspp] / src / language / stats / matrix.c
index b1ec91474dbf88d0eda8fc9cd11172e85b17cf57..8a08740183a54f72dba21798abae29d9fa42d6c1 100644 (file)
@@ -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. */