- const union value *uv = case_data (c, mr->rowtype);
- int col, row;
- for (col = 0; col < n_vars; ++col)
- {
- const struct variable *cv = vars[col];
- double x = case_data (c, cv)->f;
- if (0 == strncasecmp ((char *)value_str (uv, 8), "N ", 8))
- for (row = 0; row < n_vars; ++row)
- gsl_matrix_set (mr->n_vectors, row, col, x);
- else if (0 == strncasecmp ((char *) value_str (uv, 8), "MEAN ", 8))
- for (row = 0; row < n_vars; ++row)
- gsl_matrix_set (mr->mean_vectors, row, col, x);
- else if (0 == strncasecmp ((char *) value_str (uv, 8), "STDDEV ", 8))
- for (row = 0; row < n_vars; ++row)
- gsl_matrix_set (mr->var_vectors, row, col, x * x);
- }
+ struct substring rowtype = case_ss (c, mr->rowtype);
+ ss_rtrim (&rowtype, ss_cstr (CC_SPACES));
+
+ gsl_matrix *v
+ = (ss_equals_case (rowtype, ss_cstr ("N")) ? mm->n
+ : ss_equals_case (rowtype, ss_cstr ("MEAN")) ? mm->mean_matrix
+ : ss_equals_case (rowtype, ss_cstr ("STDDEV")) ? mm->var_matrix
+ : NULL);
+ if (v)
+ {
+ for (int x = 0; x < n_vars; ++x)
+ {
+ double n = case_num (c, vars[x]);
+ if (v == mm->var_matrix)
+ n *= n;
+ for (int y = 0; y < n_vars; ++y)
+ gsl_matrix_set (v, y, x, n);
+ }
+ continue;
+ }
+
+ struct matrix *m = NULL;
+ for (size_t i = 0; i < N_MATRICES; i++)
+ if (ss_equals_case (rowtype, ss_cstr (matrices[i].name)))
+ {
+ m = &matrices[i];
+ break;
+ }
+ if (m)
+ {
+ struct substring varname_raw = case_ss (c, mr->varname);
+ struct substring varname = ss_cstr (
+ recode_string (UTF8, dict_get_encoding (mr->dict),
+ varname_raw.string, varname_raw.length));
+ ss_rtrim (&varname, ss_cstr (CC_SPACES));
+ varname.string[varname.length] = '\0';
+
+ int y = find_varname (vars, n_vars, varname.string);
+ if (y >= 0)
+ {
+ m->good_rows++;
+ matrix_fill_row (m->m, c, y, vars, n_vars);
+ }
+ else
+ m->bad_rows++;
+ ss_dealloc (&varname);
+ }
+ }
+ casereader_destroy (group);