int
cmd_mconvert (struct lexer *lexer, struct dataset *ds)
{
- bool append UNUSED = false;
+ bool append = false;
struct file_handle *in = NULL;
struct file_handle *out = NULL;
while (lex_token (lexer) != T_ENDCMD)
if (!matrix_reader_next (&mm, mr, &group))
break;
- struct ccase *model = NULL;
+ bool add_corr = mm.cov && !mm.corr;
+ bool add_cov = mm.corr && !mm.cov;
+ bool remove_corr = add_cov && !append;
+ bool remove_cov = add_corr && !append;
+
+ struct ccase *model = casereader_peek (group, 0);
+ for (size_t i = 0; i < mr->n_fvars; i++)
+ *case_num_rw (model, mr->fvars[i]) = SYSMIS;
+
for (;;)
{
struct ccase *c = casereader_read (group);
if (!c)
break;
- if (!model)
- {
- struct substring rowtype
- = matrix_reader_get_string (c, mr->rowtype);
- if (ss_equals_case (rowtype, ss_cstr ("COV"))
- || ss_equals_case (rowtype, ss_cstr ("CORR")))
- model = case_ref (c);
- }
- casewriter_write (cw, c);
+ struct substring rowtype = matrix_reader_get_string (c, mr->rowtype);
+ if ((remove_cov && ss_equals_case (rowtype, ss_cstr ("COV")))
+ || (remove_corr && ss_equals_case (rowtype, ss_cstr ("CORR"))))
+ case_unref (c);
+ else
+ casewriter_write (cw, c);
}
+ casereader_destroy (group);
- if (!model)
- continue;
-
- if (mm.cov && !mm.corr)
+ if (add_corr)
{
assert (mm.cov->size1 == mr->n_cvars);
assert (mm.cov->size2 == mr->n_cvars);
casewriter_write (cw, c);
}
- if (mm.corr && !mm.cov)
+ if (add_cov)
{
assert (mm.corr->size1 == mr->n_cvars);
assert (mm.corr->size2 == mr->n_cvars);
double corr = gsl_matrix_get (mm.corr, y, x);
*case_num_rw (c, mr->cvars[x]) = corr * sqrt (d1 * d2);
}
+ matrix_reader_set_string (c, mr->rowtype, ss_cstr ("COV"));
+ matrix_reader_set_string (c, mr->varname,
+ ss_cstr (var_get_name (mr->cvars[y])));
casewriter_write (cw, c);
}
}