/// <summary> /// Convert this matrix to image memory layout (if it is not already). /// Coordinates of the result start at [0, 0]. /// </summary> public static Matrix <T> ToImage <T>(this Matrix <T> matrix) { if (matrix.HasImageLayout()) { return(matrix); } return(matrix.Copy()); }
/// <summary> /// Calculates the inverse matrix using Householder transformations. /// The matrix has to be quadratic. /// </summary> public static Matrix <double> QrInverse( this Matrix <double> matrix) { var qr = matrix.Copy(); double[] diag = qr.QrFactorize(); return(qr.QrInverse(diag)); }
/// <summary> /// Invert square matrix using PLU factorization in-place. /// If the factorization fails, the matrix is unchanged and /// false is returned. /// </summary> public static bool LuInvert(this Matrix <double> matrix) { var n = matrix.SX; if (n != matrix.SY) { throw new ArgumentException("cannot invert non-square matrix"); } var lu = matrix.Copy(); var p = new int[n]; if (!lu.Data.LuFactorize(lu.Origin, lu.DX, lu.DY, p)) { return(false); } lu.Data.LuInverse(lu.Origin, lu.DX, lu.DY, p, matrix.Data, matrix.Origin, matrix.DX, matrix.DY); return(true); }
/// <summary> /// Compute the inverse of a square matrix using PLU factorization. /// The inverse matrix x is returned. Returns an invalid matrix if /// the factorization failed. /// </summary> public static Matrix <double> LuInverse(this Matrix <double> matrix) { var n = matrix.SX; if (n != matrix.SY) { throw new ArgumentException("cannot invert non-square matrix"); } var lu = matrix.Copy(); var p = new int[n]; if (!lu.Data.LuFactorize(lu.Origin, lu.DX, lu.DY, p)) { return(default(Matrix <double>)); } var inv = new Matrix <double>(matrix.Info); lu.Data.LuInverse(lu.Origin, lu.DX, lu.DY, p, inv.Data, inv.Origin, inv.DX, inv.DY); return(inv); }