/// <summary> /// Brings the MatrixD into upper triangular form using elementary row operations. /// </summary> /// <param name="value">The MatrixD to put into upper triangular form.</param> /// <param name="result">When the method completes, contains the upper triangular MatrixD.</param> /// <remarks> /// If the MatrixD is not invertible (i.e. its determinant is zero) than the result of this /// method may produce Single.Nan and Single.Inf values. When the MatrixD represents a system /// of linear equations, than this often means that either no solution exists or an infinite /// number of solutions exist. /// </remarks> public static void UpperTriangularForm(ref MatrixD value, out MatrixD result) { //Adapted from the row echelon code. result = value; int lead = 0; int rowcount = 4; int columncount = 4; for (int r = 0; r < rowcount; ++r) { if (columncount <= lead) return; int i = r; while (MathUtilD.IsZero(result[i, lead])) { i++; if (i == rowcount) { i = r; lead++; if (lead == columncount) return; } } if (i != r) { result.ExchangeRows(i, r); } double multiplier = 1d / result[r, lead]; for (; i < rowcount; ++i) { if (i != r) { result[i, 0] -= result[r, 0] * multiplier * result[i, lead]; result[i, 1] -= result[r, 1] * multiplier * result[i, lead]; result[i, 2] -= result[r, 2] * multiplier * result[i, lead]; result[i, 3] -= result[r, 3] * multiplier * result[i, lead]; } } lead++; } }
/// <summary> /// Brings the MatrixD into row echelon form using elementary row operations; /// </summary> /// <param name="value">The MatrixD to put into row echelon form.</param> /// <param name="result">When the method completes, contains the row echelon form of the MatrixD.</param> public static void RowEchelonForm(ref MatrixD value, out MatrixD result) { //Source: Wikipedia pseudo code //Reference: http://en.wikipedia.org/wiki/Row_echelon_form#Pseudocode result = value; int lead = 0; int rowcount = 4; int columncount = 4; for (int r = 0; r < rowcount; ++r) { if (columncount <= lead) return; int i = r; while (MathUtilD.IsZero(result[i, lead])) { i++; if (i == rowcount) { i = r; lead++; if (lead == columncount) return; } } if (i != r) { result.ExchangeRows(i, r); } double multiplier = 1d / result[r, lead]; result[r, 0] *= multiplier; result[r, 1] *= multiplier; result[r, 2] *= multiplier; result[r, 3] *= multiplier; for (; i < rowcount; ++i) { if (i != r) { result[i, 0] -= result[r, 0] * result[i, lead]; result[i, 1] -= result[r, 1] * result[i, lead]; result[i, 2] -= result[r, 2] * result[i, lead]; result[i, 3] -= result[r, 3] * result[i, lead]; } } lead++; } }