autoProcrustes Eigens_to_Procrustes (Eigen me, Eigen thee, long evec_from, long evec_to) { try { long nvectors = evec_to - evec_from + 1; long nmin = my numberOfEigenvalues < thy numberOfEigenvalues ? my numberOfEigenvalues : thy numberOfEigenvalues; if (my dimension != thy dimension) { Melder_throw (U"The eigenvectors must have the same dimension."); } if (evec_from > evec_to || evec_from < 1 || evec_to > nmin) { Melder_throw (U"Eigenvector range too large."); } autoNUMmatrix<double> x (1, my dimension, 1, nvectors); autoNUMmatrix<double> y (1, my dimension, 1, nvectors); for (long j = 1; j <= nvectors; j++) { for (long i = 1; i <= my dimension; i++) { x[i][j] = my eigenvectors [evec_from + j - 1] [i]; y[i][j] = thy eigenvectors [evec_from + j - 1] [i]; } } autoProcrustes him = Procrustes_create (nvectors); NUMProcrustes (x.peek(), y.peek(), my dimension, nvectors, his r, nullptr, nullptr); return him; } catch (MelderError) { Melder_throw (U"Procrustes not created from Eigens."); } }
Procrustes Eigens_to_Procrustes (I, thou, long evec_from, long evec_to) { iam (Eigen); thouart (Eigen); Procrustes him = NULL; long i, j, nvectors = evec_to - evec_from + 1; long nmin = my numberOfEigenvalues < thy numberOfEigenvalues ? my numberOfEigenvalues : thy numberOfEigenvalues; double **x = NULL, **y = NULL; if (my dimension != thy dimension) return Melder_errorp1 (L"The eigenvectors must have the same dimension."); if (evec_from > evec_to || evec_from < 1 || evec_to > nmin) return Melder_errorp1 (L"Eigenvector range too large."); x = NUMdmatrix (1, my dimension, 1, nvectors); if (x == NULL) return NULL; y = NUMdmatrix (1, my dimension, 1, nvectors); if (y == NULL) goto end; for (j = 1; j <= nvectors; j++) { for (i = 1; i <= my dimension; i++) { x[i][j] = my eigenvectors[evec_from+j-1][i]; y[i][j] = thy eigenvectors[evec_from+j-1][i]; } } him = Procrustes_create (nvectors); if (him == NULL) goto end; if (! NUMProcrustes (x, y, my dimension, nvectors, his r, NULL, NULL)) forget (him); end: NUMdmatrix_free (x, 1, 1); NUMdmatrix_free (y, 1, 1); return him; }