X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Fdesign-matrix.c;h=030efd7a2d3316ac23989b0a5ab5de38473cc4d2;hb=3bfe739c926ff5729b0f7849d49b79d65a9d0c91;hp=b81859aa5a539099f6e7a437ab053f31ce5fa202;hpb=9de93455099eff93bb2d8b730eea8413e7ab1121;p=pspp-builds.git diff --git a/src/math/design-matrix.c b/src/math/design-matrix.c index b81859aa..030efd7a 100644 --- a/src/math/design-matrix.c +++ b/src/math/design-matrix.c @@ -281,3 +281,44 @@ design_matrix_set_element (const struct design_matrix *d, size_t row, size_t col { gsl_matrix_set (d->m, row, col, x); } +/* + If VAR is categorical with d categories, its first category should + correspond to the origin in d-dimensional Euclidean space. + */ +static bool +is_origin (const struct variable *var, const union value *val) +{ + if (var_is_numeric (var)) + { + return false; + } + if (cat_value_find (var, val) == 0) + { + return true; + } + return false; +} + +/* + Return the subscript of the column of the design matrix + corresponding to VAL. If VAR is categorical with d categories, its + first category should correspond to the origin in d-dimensional + Euclidean space, so there is no subscript for this value. + */ +size_t +dm_get_exact_subscript (const struct design_matrix *dm, const struct variable *var, + const union value *val) +{ + size_t result; + + result = design_matrix_var_to_column (dm, var); + if (var_is_alpha (var)) + { + if (is_origin (var, val)) + { + return -1u; + } + result += cat_value_find (var, val) - 1; + } + return result; +}