Beispiel #1
0
 /// <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());
 }
Beispiel #2
0
        /// <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);
        }