autoMatrix Matrix_solveEquation (Matrix me, double /* tolerance */) { try { long nr = my ny, nc = my nx - 1; if (nc == 0) { Melder_throw (U"Matrix_solveEquation: there must be at least 2 columns in the matrix."); } if (nr < nc) { Melder_warning (U"Matrix_solveEquation: solution is not unique (fewer equations than unknowns)."); } autoNUMmatrix<double> u (1, nr, 1, nc); autoNUMvector<double> b (1, nr); autoNUMvector<double> x (1, nc); autoMatrix thee = Matrix_create (0.5, 0.5 + nc, nc, 1, 1, 0.5, 1.5, 1, 1, 1); for (long i = 1; i <= nr; i++) { for (long j = 1; j <= nc; j++) { u[i][j] = my z[i][j]; } b[i] = my z[i][my nx]; } NUMsolveEquation (u.peek(), nr, nc, b.peek(), 0, x.peek()); for (long j = 1; j <= nc; j++) { thy z[1][j] = x[j]; } return thee; } catch (MelderError) { Melder_throw (U"Matrix equation not solved."); } }
LinearRegression Table_to_LinearRegression (Table me) { try { long numberOfIndependentVariables = my numberOfColumns - 1, numberOfParameters = my numberOfColumns; long numberOfCells = my rows -> size, icell, ivar; if (numberOfParameters < 1) /* Includes intercept. */ Melder_throw (U"Not enough columns (has to be more than 1)."); if (numberOfCells < numberOfParameters) { Melder_warning (U"Solution is not unique (more parameters than cases)."); } autoNUMmatrix <double> u (1, numberOfCells, 1, numberOfParameters); autoNUMvector <double> b (1, numberOfCells); autoNUMvector <double> x (1, numberOfParameters); autoLinearRegression thee = LinearRegression_create (); for (ivar = 1; ivar <= numberOfIndependentVariables; ivar ++) { double minimum = Table_getMinimum (me, ivar); double maximum = Table_getMaximum (me, ivar); Regression_addParameter (thee.peek(), my columnHeaders [ivar]. label, minimum, maximum, 0.0); } for (icell = 1; icell <= numberOfCells; icell ++) { for (ivar = 1; ivar < numberOfParameters; ivar ++) { u [icell] [ivar] = Table_getNumericValue_Assert (me, icell, ivar); } u [icell] [numberOfParameters] = 1.0; /* For the intercept. */ b [icell] = Table_getNumericValue_Assert (me, icell, my numberOfColumns); // the dependent variable } NUMsolveEquation (u.peek(), numberOfCells, numberOfParameters, b.peek(), NUMeps * numberOfCells, x.peek()); thy intercept = x [numberOfParameters]; for (ivar = 1; ivar <= numberOfIndependentVariables; ivar ++) { RegressionParameter parm = static_cast<RegressionParameter> (thy parameters -> item [ivar]); parm -> value = x [ivar]; } return thee.transfer(); } catch (MelderError) { Melder_throw (me, U": linear regression not performed."); } }