autoMixingMatrix MixingMatrix_createSimple (long numberOfChannels, long numberOfComponents, char32 *elements) { try { long inum = 1, ntokens = Melder_countTokens (elements); if (ntokens == 0) { Melder_throw (U"No matrix elements."); } long nwanted = numberOfChannels * numberOfComponents; autoMixingMatrix me = MixingMatrix_create (numberOfChannels, numberOfComponents); // Construct the full matrix from the elements double number; for (char32 *token = Melder_firstToken (elements); token != nullptr && inum <= ntokens; token = Melder_nextToken (), inum++) { long irow = (inum - 1) / numberOfComponents + 1; long icol = (inum - 1) % numberOfComponents + 1; Interpreter_numericExpression (0, token, &number); my data[irow][icol] = number; } if (ntokens < nwanted) { for (long i = inum; i <= nwanted; i++) { long irow = (inum - 1) / numberOfComponents + 1; long icol = (inum - 1) % numberOfComponents + 1; my data[irow][icol] = number; // repeat the last number given! } } return me; } catch (MelderError) { Melder_throw (U"MixingMatrix not created."); } }
double *NUMstring_to_numbers (const char32 *s, long *numbers_found) { *numbers_found = Melder_countTokens (s); if (*numbers_found < 1) { Melder_throw (U"Empty string."); } autoNUMvector<double> numbers (1, *numbers_found); long inum = 1; for (char32 *token = Melder_firstToken (s); token != 0; token = Melder_nextToken (), inum++) { Interpreter_numericExpression (0, token, &numbers[inum]); } return numbers.transfer(); }
autoCrossCorrelationTable CrossCorrelationTable_createSimple (char32 *covars, char32 *centroid, long numberOfSamples) { try { long dimension = Melder_countTokens (centroid); long ncovars = Melder_countTokens (covars); long ncovars_wanted = dimension * (dimension + 1) / 2; if (ncovars != ncovars_wanted) Melder_throw (U"The number of matrix elements and the number of " U"centroid elements are not in concordance. There should be \"d(d+1)/2\" matrix values and \"d\" centroid values."); autoCrossCorrelationTable me = CrossCorrelationTable_create (dimension); // Construct the full matrix from the upper-diagonal elements long inum = 1, irow = 1; for (char32 *token = Melder_firstToken (covars); token != nullptr && inum <= ncovars_wanted; token = Melder_nextToken (), inum++) { double number; long nmissing = (irow - 1) * irow / 2; long inumc = inum + nmissing; irow = (inumc - 1) / dimension + 1; long icol = ( (inumc - 1) % dimension) + 1; Interpreter_numericExpression (nullptr, token, &number); my data[irow][icol] = my data[icol][irow] = number; if (icol == dimension) { irow++; } } inum = 1; for (char32 *token = Melder_firstToken (centroid); token != nullptr && inum <= dimension; token = Melder_nextToken (), inum++) { double number; Interpreter_numericExpression (nullptr, token, &number); my centroid[inum] = number; } my numberOfObservations = numberOfSamples; return me; } catch (MelderError) { Melder_throw (U"CrossCorrelationTable not created."); } }