X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Flinreg%2Flinreg.c;h=3c086a98f22ce1868ac581e1cdc4bc359671483f;hb=c17ea35a73b7a690a54c5c6a213de19f0376e74f;hp=9ba84f60ece9d8c3991be31cce09766129e886ef;hpb=bf3da7e3a72705f3e9d0d09ba29039928dc64687;p=pspp-builds.git diff --git a/src/math/linreg/linreg.c b/src/math/linreg/linreg.c index 9ba84f60..3c086a98 100644 --- a/src/math/linreg/linreg.c +++ b/src/math/linreg/linreg.c @@ -110,7 +110,7 @@ pspp_linreg_get_vars (const void *c_, const struct variable **v) /* Start at c->coeff[1] to avoid the intercept. */ - v[result] = pspp_coeff_get_var (c->coeff[1], 0); + v[result] = pspp_coeff_get_var (c->coeff[1], 0); result = (v[result] == NULL) ? 0 : 1; for (coef = c->coeff[2]; coef < c->coeff[c->n_coeffs]; coef++) @@ -366,6 +366,18 @@ pspp_linreg (const gsl_vector * Y, const gsl_matrix * X, } gsl_matrix_free (sw); } + else if (cache->method == PSPP_LINREG_CONDITIONAL_INVERSE) + { + /* + Use the SVD of X^T X to find a conditional inverse of X^TX. If + the SVD is X^T X = U D V^T, then set the conditional inverse + to (X^T X)^c = V D^- U^T. D^- is defined as follows: If entry + (i, i) has value sigma_i, then entry (i, i) of D^- is 1 / + sigma_i if sigma_i > 0, and 0 otherwise. Then solve the normal + equations by setting the estimated parameter vector to + (X^TX)^c X^T Y. + */ + } else { gsl_multifit_linear_workspace *wk;