X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fcorrelation.c;h=bac81e4349360ef902a7e99b63768c0cafed42af;hb=24209afdf25f72722439aa6317b0499750824afe;hp=e7ebd1f52dbc94ac8469af1c23b68eefe715547d;hpb=fe8dc2171009e90d2335f159d05f7e6660e24780;p=pspp diff --git a/src/math/correlation.c b/src/math/correlation.c index e7ebd1f52d..bac81e4349 100644 --- a/src/math/correlation.c +++ b/src/math/correlation.c @@ -16,6 +16,7 @@ #include +#include #include "math/correlation.h" #include @@ -39,7 +40,7 @@ significance_of_correlation (double rho, double w) t = sqrt (t); t *= rho; - + if (t > 0) return gsl_cdf_tdist_Q (t, w - 2); else @@ -51,20 +52,45 @@ correlation_from_covariance (const gsl_matrix *cv, const gsl_matrix *v) { 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; +}