Пример #1
0
        private static MatrixNxN <T> CreateMatrixForCramersRule(MatrixNxN <T> matrixFrom, int skipColumn, List <T> equationRightSideResults)
        {
            var matrix = new MatrixNxN <T>(matrixFrom);

            matrix.SetColumn(skipColumn, equationRightSideResults);
            return(matrix);
        }
Пример #2
0
        /// <summary>
        /// Create inverse of matrix.
        /// </summary>
        /// <returns>Matrix inverse</returns>
        public MatrixNxN <T> Inverse()
        {
            var cofactorMatrix = new MatrixNxN <T>(Rows);

            for (int row = 0; row < Rows; row++)
            {
                for (int column = 0; column < Columns; column++)
                {
                    var submatrix = CreateSubmatrix(this, row, column);
                    cofactorMatrix[row, column] = (dynamic)submatrix.Determinant() * (int)Math.Pow(-1, row + column);
                }
            }
            return(new MatrixNxN <T>(cofactorMatrix.Transpose() * ((dynamic)1.0 / Determinant())));
        }
Пример #3
0
        private static MatrixNxN <T> CreateSubmatrix(MatrixNxN <T> matrix, int skipRow, int skipColumn)
        {
            var submatrix = new MatrixNxN <T>(matrix.Rows - 1);
            var column    = 0;

            for (int k = 0; k < matrix.Columns; k++)
            {
                if (k != skipColumn)
                {
                    var columnValues = matrix.GetColumn(k).ToList();
                    columnValues.RemoveAt(skipRow);
                    submatrix.SetColumn(column, columnValues);
                    column++;
                }
            }
            return(submatrix);
        }
Пример #4
0
        private static T DeterminantLaPlace(MatrixNxN <T> matrix)
        {
            if (matrix.Rows == 1) // matrix.Columns == 1
            {
                return(matrix[0, 0]);
            }
            if (matrix.Rows == 2) // matrix.Columns == 2
            {
                var ac = (dynamic)matrix[0, 0] * matrix[1, 1];
                var bd = (dynamic)matrix[0, 1] * matrix[1, 0];
                return(ac - bd);
            }
            dynamic determinant = 0;

            for (int i = 0; i < matrix.Columns; i++)
            {
                var submatrix = CreateSubmatrix(matrix, 0, i);
                determinant += (int)Math.Pow(-1, i) * (dynamic)matrix[0, i] * submatrix.Determinant();
            }
            return(determinant);
        }