#include <config.h>
+#include <assert.h>
#include "math/correlation.h"
#include <gsl/gsl_matrix.h>
t = sqrt (t);
t *= rho;
-
+
if (t > 0)
return gsl_cdf_tdist_Q (t, w - 2);
else
{
size_t i, j;
gsl_matrix *corr = gsl_matrix_calloc (cv->size1, cv->size2);
-
+
for (i = 0 ; i < cv->size1; ++i)
{
for (j = 0 ; j < cv->size2; ++j)
{
double rho = gsl_matrix_get (cv, i, j);
-
+
rho /= sqrt (gsl_matrix_get (v, i, j))
- *
+ *
sqrt (gsl_matrix_get (v, j, i));
-
+
gsl_matrix_set (corr, i, j, rho);
}
}
-
+
return corr;
}
+
+gsl_matrix *
+covariance_from_correlation (const gsl_matrix *corr, const gsl_matrix *v)
+{
+ size_t i, j;
+ assert (corr->size1 == corr->size2);
+
+ gsl_matrix *output = gsl_matrix_calloc (corr->size1, corr->size2);
+
+ for (i = 0 ; i < corr->size1; ++i)
+ {
+ for (j = 0 ; j < corr->size2; ++j)
+ {
+ double r = gsl_matrix_get (corr, i, j);
+
+ r *= sqrt (gsl_matrix_get (v, i, j))
+ *
+ sqrt (gsl_matrix_get (v, j, i));
+
+ gsl_matrix_set (output, i, j, r);
+ }
+ }
+
+ return output;
+}