/// <summary> /// Метод находящий ранг матрицы. /// </summary> /// <returns> Ранг матрицы. </returns> public int FindRank() { var columnLength = MatrixValue.GetLength(0); // длина колонки матрицы. var rowLength = MatrixValue.GetLength(1); // длина строки матрицы. var rank = 0; var newMatrix = this.MethodThatResetsTheColumnValues(0, 0); for (int i = 0; i < columnLength - 1; i++) { newMatrix = this.MethodThatResetsTheColumnValues(i, i); } for (int i = 0; i < columnLength; i++) { for (int j = 0; j < rowLength; j++) { if (MatrixValue[i, j] != 0) { rank++; break; } } } return(rank); }
/// <summary> /// Метод находящий и выносящий общий множитель из матрицы. /// </summary> /// <returns> Измененая матрица. </returns> public Matrix FindTheCommonMultiplier() { var columnLength = MatrixValue.GetLength(0); // длина колонки матрицы. var rowLength = MatrixValue.GetLength(1); // длина строки матрицы. var newMatrix = new Matrix(new double[columnLength, rowLength]); newMatrix = LoadMatrixData(this, newMatrix); newMatrix.MatrixValue = this.MatrixValue; for (int i = 0; i < columnLength; i++) { var commonMultiplier = 1.0; var isThereCommonMultiplier = true; for (int j = 0; j < rowLength; j++) { if (MatrixValue[i, j] != 1) { if (rowLength != j + 1) { if (commonMultiplier == 1.0) { commonMultiplier = GCF(MatrixValue[i, j], MatrixValue[i, j + 1]); } else { if (commonMultiplier % GCF(MatrixValue[i, j], MatrixValue[i, j + 1]) != 0) { isThereCommonMultiplier = false; } } } } else { commonMultiplier = 1.0; isThereCommonMultiplier = false; } } if (isThereCommonMultiplier == true && commonMultiplier != -1) { if (commonMultiplier < 0) { commonMultiplier *= -1; } newMatrix = TakeOutTheTotalMultiplier(this, i + 1, commonMultiplier, enumMatrix.row); } } return(newMatrix); }
/// <summary> /// Метод транспонирующий матрицу. /// </summary> /// <returns> Измененая матрица. </returns> public Matrix MatrixTransposition() { Console.WriteLine(); Console.WriteLine("Трансаонирование матрицы."); Console.WriteLine(); var matrixColumnLength = MatrixValue.GetLength(0); // длина колонки матрицы. var matrixRowLength = MatrixValue.GetLength(1); // длина строки матрицы. Matrix matrixResult = new Matrix(new double[matrixColumnLength, matrixRowLength]); // результат транспонирования. matrixResult.IsMatrixTransposition = !IsMatrixTransposition; for (int i = 0; i < matrixColumnLength; i++) { for (int j = 0; j < matrixRowLength; j++) { matrixResult.MatrixValue[i, j] = MatrixValue[j, i]; } } matrixResult.IsMatrixInverse = IsMatrixInverse; matrixResult.IsMatrixUnion = IsMatrixUnion; matrixResult.CommonMultiplier = CommonMultiplier; Console.WriteLine(); for (int i = 0; i < matrixColumnLength; i++) { for (int j = 0; j < matrixRowLength; j++) { Console.Write($" {MatrixValue[i, j]} "); } Console.WriteLine(); } Console.WriteLine(); for (int i = 0; i < matrixColumnLength; i++) { for (int j = 0; j < matrixRowLength; j++) { Console.Write($" {matrixResult.MatrixValue[i, j]} "); } Console.WriteLine(); } return(matrixResult); }
/// <summary> /// Метод который обнуляет значения столбцов. /// </summary> /// <returns> Матрица. </returns> public Matrix MethodThatResetsTheColumnValues(int column, int row) { var columnLength = MatrixValue.GetLength(0); // длина колонки матрицы. var rowLength = MatrixValue.GetLength(1); // длина строки матрицы. var matrixResult = new Matrix(new double[columnLength, rowLength]); if (column == 0 && row == 0) { for (int i = 0; i < columnLength; i++) { for (int j = 0; j < rowLength; j++) { if (MatrixValue[i, j] == 1) { if (i > 0) { matrixResult = SwapColumnsOrRows(row + 1, i + 1); } if (j > 0) { matrixResult = SwapColumnsOrRows(column + 1, j + 1, enumMatrix.column); } goto Break; } } } } Break: var isЕlementZero = false; if (MatrixValue[column, row] == 0) { column--; row--; isЕlementZero = true; } while (true) { if (MatrixValue[column, row] != 1) { var result = 0.0; var multiplier = 0.0; var multiplier2 = 1.0; if (MatrixValue[column, row] > 0) { if (MatrixValue[column + 1, row] > 0) { multiplier2 *= -1; } else { multiplier2 *= 1; } } else { if (MatrixValue[column + 1, row] > 0) { multiplier2 *= 1; } else { multiplier2 *= -1; } } var resultValue = 1.0; if (column != 0 && row != 0) { resultValue = 0; } var iterator = 0; do { iterator++; result = MatrixValue[column, row] * multiplier + MatrixValue[column + 1, row]; if (result != resultValue) { multiplier += 0.1 * multiplier2; multiplier = Math.Round(multiplier, 2); } if (iterator == 100) { matrixResult.MatrixValue = MatrixValue; goto End; } }while (result != resultValue); if (multiplier == 0) { multiplier = multiplier2; } if (isЕlementZero == true) { matrixResult = SixthPropertyOfTheDeterminant(multiplier, row + 1, row + 3); } else { matrixResult = SixthPropertyOfTheDeterminant(multiplier, row + 1, row + 2); } if (column == 0 && row == 0) { matrixResult = SwapColumnsOrRows(row + 1, row + 2); } End: MatrixValue = matrixResult.MatrixValue; } else { for (int i = 1; i < columnLength; i++) { var multiplier = MatrixValue[i, row]; if (multiplier != 0) { matrixResult = SixthPropertyOfTheDeterminant(multiplier * -1, row + 1, i + 1); MatrixValue = matrixResult.MatrixValue; } } break; } if (column != 0 && row != 0) { break; } } return(matrixResult); }
/// <summary> /// Метод умножающий строку или колонку num1 на number и складывающий ее со строкой или колонкой num2. /// </summary> /// <param name="multiplier"> Множитель. </param> /// <param name="num1"> Первая строка или столбик. </param> /// <param name="num2"> Вторая строка или столбик. </param> /// <param name="enumMatrix"> Переключатель между строкой или столбиком. </param> /// <returns> Измененая матрица. </returns> public Matrix SixthPropertyOfTheDeterminant(double multiplier, int num1, int num2, enumMatrix enumMatrix = enumMatrix.row) { var columnLength = MatrixValue.GetLength(0); // длина колонки матрицы. var rowLength = MatrixValue.GetLength(1); // длина строки матрицы. var newMatrix = new Matrix(new double[columnLength, rowLength]); // Новая матрица. newMatrix = LoadMatrixData(this, newMatrix); Console.WriteLine(); Console.WriteLine("Шестое свойство определителя"); Console.WriteLine(); Console.WriteLine($"Множмтель: {newMatrix.CommonMultiplier}"); Console.WriteLine(); Console.WriteLine($"Множитель шестого правила: {multiplier}"); Console.WriteLine(); if (num1 != num2) { if (enumMatrix == enumMatrix.row) { for (int i = 0; i < columnLength; i++) { for (int j = 0; j < rowLength; j++) { if (num2 - 1 == i) { newMatrix.MatrixValue[i, j] = MatrixValue[num1 - 1, j] * multiplier + MatrixValue[num2 - 1, j]; Console.Write($"({MatrixValue[num1 - 1, j]} * {multiplier} + {MatrixValue[num2 - 1, j]})"); } else { newMatrix.MatrixValue[i, j] = MatrixValue[i, j]; Console.Write($"{newMatrix.MatrixValue[i, j]} "); } } Console.WriteLine(); } } else if (enumMatrix == enumMatrix.column) { for (int i = 0; i < columnLength; i++) { for (int j = 0; j < rowLength; j++) { if (num2 - 1 == j) { newMatrix.MatrixValue[i, j] = MatrixValue[i, num1 - 1] * multiplier + MatrixValue[i, num2 - 1]; Console.Write($"({MatrixValue[i, num1 - 1]} * {multiplier} + {MatrixValue[i, num2 - 1]})"); } else { newMatrix.MatrixValue[i, j] = MatrixValue[i, j]; Console.Write($"{newMatrix.MatrixValue[i, j]} "); } } Console.WriteLine(); } } } Console.WriteLine(); Console.WriteLine($"Множмтель: {newMatrix.CommonMultiplier}"); Console.WriteLine(); for (int i = 0; i < columnLength; i++) { for (int j = 0; j < rowLength; j++) { Console.Write($"{newMatrix.MatrixValue[i, j]} "); } Console.WriteLine(); } Console.WriteLine(); MatrixValue = newMatrix.MatrixValue; return(newMatrix); }
/// <summary> /// Метод меняющий элементы в матрицах местами. /// </summary> /// <param name="num1"> Первая строка или столбик. </param> /// <param name="num2"> Вторая строка или столбик. </param> /// <param name="enumMatrix"> Переключатель между строкой или столбиком. </param> /// <returns> Измененая матрица. </returns> public Matrix SwapColumnsOrRows(int num1, int num2, enumMatrix enumMatrix = enumMatrix.row) { var columnLength = MatrixValue.GetLength(0); // длина колонки матрицы. var rowLength = MatrixValue.GetLength(1); // длина строки матрицы. var newMatrix = new Matrix(new double[columnLength, rowLength]); // Новая матрица. if (enumMatrix == enumMatrix.row) { for (int i = 0; i < columnLength; i++) { for (int j = 0; j < rowLength; j++) { if (i == num1 - 1) { newMatrix.MatrixValue[i, j] = MatrixValue[num2 - 1, j]; } else if (i == num2 - 1) { newMatrix.MatrixValue[i, j] = MatrixValue[num1 - 1, j]; } else { newMatrix.MatrixValue[i, j] = MatrixValue[i, j]; } } } } else if (enumMatrix == enumMatrix.column) { for (int i = 0; i < columnLength; i++) { for (int j = 0; j < rowLength; j++) { if (j == num1 - 1) { newMatrix.MatrixValue[i, j] = MatrixValue[i, num2 - 1]; } else if (j == num2 - 1) { newMatrix.MatrixValue[i, j] = MatrixValue[i, num1 - 1]; } else { newMatrix.MatrixValue[i, j] = MatrixValue[i, j]; } } } } newMatrix = LoadMatrixData(this, newMatrix); newMatrix.CommonMultiplier = CommonMultiplier * -1; Console.WriteLine(); Console.WriteLine($"Меняем {enumMatrix} {num1} и {num2} местами"); Console.WriteLine(); Console.WriteLine($"Множмтель: {newMatrix.CommonMultiplier}"); Console.WriteLine(); for (int i = 0; i < columnLength; i++) { for (int j = 0; j < rowLength; j++) { Console.Write($" {MatrixValue[i, j]} "); } Console.WriteLine(); } Console.WriteLine(); Console.WriteLine($"Множмтель: {newMatrix.CommonMultiplier}"); Console.WriteLine(); for (int i = 0; i < columnLength; i++) { for (int j = 0; j < rowLength; j++) { Console.Write($" {newMatrix.MatrixValue[i, j]} "); } Console.WriteLine(); } Console.WriteLine(); MatrixValue = newMatrix.MatrixValue; CommonMultiplier = newMatrix.CommonMultiplier; return(newMatrix); }