- /* Special case for SD and N_VECTOR: Rewrite as STDDEV and N respectively */
- if (0 == strncasecmp (val, "sd ", ROWTYPE_WIDTH))
- {
- value_copy_buf_rpad (case_data_rw (outcase, mformat->rowtype), ROWTYPE_WIDTH,
- (uint8_t *) "STDDEV", 6, ' ');
- }
- else if (0 == strncasecmp (val, "n_vector", ROWTYPE_WIDTH))
- {
- value_copy_buf_rpad (case_data_rw (outcase, mformat->rowtype), ROWTYPE_WIDTH,
- (uint8_t *) "N", 1, ' ');
- }
+static void
+matrix_sched_init (const struct matrix_format *mf, enum rowtype rt,
+ gsl_matrix *m)
+{
+ int n_dims = rowtype_dimensions (rt);
+ const struct matrix_sched *ms = &mf->ms[n_dims];
+ double diagonal = n_dims < 2 || rt != C_CORR ? SYSMIS : 1.0;
+ for (size_t y = 0; y < ms->nr; y++)
+ for (size_t x = 0; x < ms->nc; x++)
+ gsl_matrix_set (m, y, x, y == x ? diagonal : SYSMIS);
+}
+
+static void
+matrix_sched_output (const struct matrix_format *mf, enum rowtype rt,
+ gsl_matrix *m, const double *d, int split_num,
+ struct casewriter *w)
+{
+ int n_dims = rowtype_dimensions (rt);
+ const struct matrix_sched *ms = &mf->ms[n_dims];
+
+ if (rt == C_N_SCALAR)
+ {
+ for (size_t x = 1; x < mf->n_cvars; x++)
+ gsl_matrix_set (m, 0, x, gsl_matrix_get (m, 0, 0));
+ rt = C_N;
+ }
+
+ for (int y = 0; y < ms->nr; y++)
+ {
+ struct ccase *c = case_create (casewriter_get_proto (w));
+ for (size_t i = 0; mf->input_vars[i] != mf->cvars[0]; i++)
+ if (mf->input_vars[i] != mf->rowtype)
+ *case_num_rw (c, mf->input_vars[i]) = d[i];
+ if (mf->n_svars && !mf->svar_indexes)
+ *case_num_rw (c, mf->svars[0]) = split_num;
+ set_string (c, mf->rowtype, rowtype_name (rt));
+ const char *varname = n_dims == 2 ? var_get_name (mf->cvars[y]) : "";
+ set_string (c, mf->varname, ss_cstr (varname));
+ for (int x = 0; x < mf->n_cvars; x++)
+ *case_num_rw (c, mf->cvars[x]) = gsl_matrix_get (m, y, x);
+ casewriter_write (w, c);
+ }
+}
+
+static void
+matrix_sched_output_n (const struct matrix_format *mf, double n,
+ gsl_matrix *m, const double *d, int split_num,
+ struct casewriter *w)
+{
+ gsl_matrix_set (m, 0, 0, n);
+ matrix_sched_output (mf, C_N_SCALAR, m, d, split_num, w);
+}