Fix memory leaks in FACTOR/MATRIX
[pspp] / src / language / stats / factor.c
index 8a38082bfa101371385d6fc6e78b25b81a340c2f..ae42d406a6d9b17cead82e7cb2276e978c3ffda3 100644 (file)
@@ -266,10 +266,6 @@ idata_free (struct idata *id)
   gsl_vector_free (id->msr);
   gsl_vector_free (id->eval);
   gsl_matrix_free (id->evec);
-  if (id->mm.cov != NULL)
-    gsl_matrix_free (id->mm.cov);
-  if (id->mm.corr != NULL)
-    gsl_matrix_free (CONST_CAST (gsl_matrix *, id->mm.corr));
 
   free (id);
 }
@@ -1480,7 +1476,9 @@ cmd_factor (struct lexer *lexer, struct dataset *ds)
        {
          do_factor_by_matrix (&factor, id);
 
+         gsl_matrix_free (id->mm.corr);
          id->mm.corr = NULL;
+         gsl_matrix_free (id->mm.cov);
          id->mm.cov = NULL;
        }
 
@@ -1969,7 +1967,7 @@ show_factor_correlation (const struct cmd_factor * factor, const gsl_matrix *fcm
   for (i = 0 ; i < fcm->size1; ++i)
     {
       for (j = 0 ; j < fcm->size2; ++j)
-       tab_double (t, heading_columns + i,  heading_rows +j, 0,
+       tab_double (t, heading_columns + j,  heading_rows + i, 0,
                    gsl_matrix_get (fcm, i, j), NULL, RC_OTHER);
     }
 
@@ -2065,7 +2063,7 @@ show_correlation_matrix (const struct cmd_factor *factor, const struct idata *id
          for (i = 0; i < factor->n_vars; ++i)
            {
              for (j = 0; j < factor->n_vars; ++j)
-               tab_double (t, heading_columns + i,  y + j, 0, gsl_matrix_get (idata->mm.corr, i, j), NULL, RC_OTHER);
+               tab_double (t, heading_columns + j,  y + i, 0, gsl_matrix_get (idata->mm.corr, i, j), NULL, RC_OTHER);
            }
        }
 
@@ -2084,7 +2082,7 @@ show_correlation_matrix (const struct cmd_factor *factor, const struct idata *id
                  if (i == j)
                    continue;
 
-                 tab_double (t, heading_columns + i,  y + j, 0, significance_of_correlation (rho, w), NULL, RC_PVALUE);
+                 tab_double (t, heading_columns + j,  y + i, 0, significance_of_correlation (rho, w), NULL, RC_PVALUE);
                }
            }
        }
@@ -2106,7 +2104,6 @@ show_covariance_matrix (const struct cmd_factor *factor, const struct idata *ida
   struct tab_table *t ;
   size_t i, j;
   int y_pos_corr = -1;
-  int y_pos_sig = -1;
   int suffix_rows = 0;
 
   const int heading_rows = 1;
@@ -2177,7 +2174,7 @@ show_covariance_matrix (const struct cmd_factor *factor, const struct idata *ida
          for (i = 0; i < factor->n_vars; ++i)
            {
              for (j = 0; j < factor->n_vars; ++j)
-               tab_double (t, heading_columns + i,  y + j, 0, gsl_matrix_get (idata->mm.cov, i, j), NULL, RC_OTHER);
+               tab_double (t, heading_columns + j,  y + i, 0, gsl_matrix_get (idata->mm.cov, i, j), NULL, RC_OTHER);
            }
        }
     }
@@ -2216,6 +2213,9 @@ do_factor (const struct cmd_factor *factor, struct casereader *r)
   do_factor_by_matrix (factor, idata);
 
  finish:
+  gsl_matrix_free (idata->mm.corr);
+  gsl_matrix_free (idata->mm.cov);
+
   idata_free (idata);
   casereader_destroy (r);
 }