void TableOfReal_insertColumn (TableOfReal me, long columnNumber) { try { if (columnNumber < 1 || columnNumber > my numberOfColumns + 1) Melder_throw ("Cannot create column ", columnNumber, "."); autoNUMmatrix <double> data (1, my numberOfRows, 1, my numberOfColumns + 1); autoNUMvector <wchar_t*> columnLabels (1, my numberOfColumns + 1); // not autostringvector... for (long j = 1; j < columnNumber; j ++) { columnLabels [j] = my columnLabels [j]; // ...because this is a dangling copy for (long i = 1; i <= my numberOfRows; i ++) data [i] [j] = my data [i] [j]; } for (long j = my numberOfColumns + 1; j > columnNumber; j --) { columnLabels [j] = my columnLabels [j - 1]; for (long i = 1; i <= my numberOfRows; i ++) data [i] [j] = my data [i] [j - 1]; } /* * Change without error. */ NUMvector_free (my columnLabels, 1); my columnLabels = columnLabels.transfer(); NUMmatrix_free (my data, 1, 1); my data = data.transfer(); my numberOfColumns ++; } catch (MelderError) { Melder_throw (me, ": column at position ", columnNumber, " not inserted."); } }
autoConfusion Confusion_condense (Confusion me, const char32 *search, const char32 *replace, long maximumNumberOfReplaces, int use_regexp) { try { long nmatches, nstringmatches; if (my rowLabels == 0 || my columnLabels == 0) { Melder_throw (U"No row or column labels."); } autostring32vector rowLabels (strs_replace (my rowLabels, 1, my numberOfRows, search, replace, maximumNumberOfReplaces, &nmatches, &nstringmatches, use_regexp), 1, my numberOfRows); autostring32vector columnLabels (strs_replace (my columnLabels, 1, my numberOfColumns, search, replace, maximumNumberOfReplaces, &nmatches, &nstringmatches, use_regexp), 1, my numberOfColumns); autoStrings srow = Thing_new (Strings); srow -> numberOfStrings = my numberOfRows; srow -> strings = rowLabels.transfer(); autoStrings scol = Thing_new (Strings); scol -> numberOfStrings = my numberOfColumns; scol -> strings = columnLabels.transfer(); /* Find dimension of new Confusion */ autoDistributions dcol = Strings_to_Distributions (scol.get()); long nresp = dcol -> numberOfRows; autoDistributions drow = Strings_to_Distributions (srow.get()); long nstim = drow -> numberOfRows; autoConfusion thee = Confusion_create (nstim, nresp); NUMstrings_copyElements (drow -> rowLabels, thy rowLabels, 1, nstim); NUMstrings_copyElements (dcol -> rowLabels, thy columnLabels, 1, nresp); autoNUMvector<long> rowIndex (1, my numberOfRows); create_index (srow -> strings, 1, my numberOfRows, drow -> rowLabels, 1, nstim, rowIndex.peek()); autoNUMvector<long> columnIndex (1, my numberOfColumns); create_index (scol -> strings, 1, my numberOfColumns, dcol -> rowLabels, 1, nresp, columnIndex.peek()); for (long i = 1; i <= my numberOfRows; i++) { for (long j = 1; j <= my numberOfColumns; j++) { thy data [rowIndex [i]][columnIndex[j]] += my data[i][j]; } } return thee; } catch (MelderError) { Melder_throw (me, U": not condensed."); } }