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); }
/// <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()))); }
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); }
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); }