void Transition_eigen (Transition me, Matrix *out_eigenvectors, Matrix *out_eigenvalues) { *out_eigenvectors = NULL; *out_eigenvalues = NULL; bool transposed = false; try { autoEigen eigen = Thing_new (Eigen); Transition_transpose (me); Eigen_initFromSymmetricMatrix (eigen.peek(), my data, my numberOfStates); Transition_transpose (me); transposed = true; autoMatrix eigenvectors = Matrix_createSimple (my numberOfStates, my numberOfStates); autoMatrix eigenvalues = Matrix_createSimple (my numberOfStates, 1); for (long i = 1; i <= my numberOfStates; i ++) { eigenvalues -> z [i] [1] = eigen -> eigenvalues [i]; for (long j = 1; j <= my numberOfStates; j ++) eigenvectors -> z [i] [j] = eigen -> eigenvectors [j] [i]; } *out_eigenvectors = eigenvectors.transfer(); *out_eigenvalues = eigenvalues.transfer(); } catch (MelderError) { if (transposed) Transition_transpose (me); Melder_throw (me, ": eigenvectors not computed."); } }
autoMatrix Matrix_readFromRawTextFile (MelderFile file) { // BUG: not Unicode-compatible try { autofile f = Melder_fopen (file, "rb"); /* * Count number of columns. */ long ncol = 0; for (;;) { int kar = fgetc (f); if (kar == '\n' || kar == '\r' || kar == EOF) break; if (kar == ' ' || kar == '\t') continue; ncol ++; do { kar = fgetc (f); } while (kar != ' ' && kar != '\t' && kar != '\n' && kar != '\r' && kar != EOF); if (kar == '\n' || kar == '\r' || kar == EOF) break; } if (ncol == 0) Melder_throw (U"File empty"); /* * Count number of elements. */ rewind (f); long nelements = 0; for (;;) { double element; if (fscanf (f, "%lf", & element) < 1) break; // zero or end-of-file nelements ++; } /* * Check if all columns are complete. */ if (nelements == 0 || nelements % ncol != 0) Melder_throw (U"The number of elements (", nelements, U") is not a multiple of the number of columns (", ncol, U")."); /* * Create simple matrix. */ long nrow = nelements / ncol; autoMatrix me = Matrix_createSimple (nrow, ncol); /* * Read elements. */ rewind (f); for (long irow = 1; irow <= nrow; irow ++) for (long icol = 1; icol <= ncol; icol ++) fscanf (f, "%lf", & my z [irow] [icol]); f.close (file); return me; } catch (MelderError) { Melder_throw (U"Matrix object not read from raw text file ", file, U"."); } }
Matrix Transition_to_Matrix (Transition me) { try { autoMatrix thee = Matrix_createSimple (my numberOfStates, my numberOfStates); for (long i = 1; i <= my numberOfStates; i ++) for (long j = 1; j <= my numberOfStates; j ++) thy z [i] [j] = my data [i] [j]; return thee.transfer(); } catch (MelderError) { Melder_throw (me, ": not converted to Matrix."); } }
autoMatrix TableOfReal_to_Matrix (TableOfReal me) { try { autoMatrix thee = Matrix_createSimple (my numberOfRows, my numberOfColumns); for (long i = 1; i <= my numberOfRows; i ++) for (long j = 1; j <= my numberOfColumns; j ++) thy z [i] [j] = my data [i] [j]; return thee; } catch (MelderError) { Melder_throw (me, U": not converted to Matrix."); } }
autoMatrix Table_to_Matrix (Table me) { try { autoMatrix thee = Matrix_createSimple (my rows.size, my numberOfColumns); for (long icol = 1; icol <= my numberOfColumns; icol ++) { Table_numericize_Assert (me, icol); } for (long irow = 1; irow <= my rows.size; irow ++) { TableRow row = my rows.at [irow]; for (long icol = 1; icol <= my numberOfColumns; icol ++) { thy z [irow] [icol] = row -> cells [icol]. number; } } return thee; } catch (MelderError) { Melder_throw (me, U": not converted to Matrix."); } }