public static RMatrix Minor(RMatrix mat, int row, int col) { RMatrix mm = new RMatrix(mat.GetnRows - 1, mat.GetnCols - 1); int ii = 0, jj = 0; for (int i = 0; i < mat.GetnRows; i++) { if (i == row) { continue; } jj = 0; for (int j = 0; j < mat.GetnCols; j++) { if (j == col) { continue; } mm[ii, jj] = mat[i, j]; jj++; } ii++; } return(mm); }
public static RMatrix operator *(RMatrix m1, RMatrix m2) { if (m1.GetnCols != m2.GetnRows) { throw new Exception("Номера столбцов таблицы" + " первая матрица должна быть равна числу " + " - строки второй матрицы!"); } double tmp; RMatrix result = new RMatrix(m1.GetnRows, m2.GetnCols); for (int i = 0; i < m1.GetnRows; i++) { for (int j = 0; j < m2.GetnCols; j++) { tmp = result[i, j]; for (int k = 0; k < result.GetnRows; k++) { tmp += m1[i, k] * m2[k, j]; } result[i, j] = tmp; } } return(result); }
public RMatrix DeepCopy() { RMatrix clone = (RMatrix)this.MemberwiseClone(); clone.nCols = this.nCols; clone.nRows = this.nRows; clone.matrix = this.matrix; return(clone); }
public static bool CompareDimension(RMatrix m1, RMatrix m2) { if (m1.GetnRows == m2.GetnRows && m1.GetnCols == m2.GetnCols) { return(true); } else { return(false); } }
public static RMatrix operator *(double d, RMatrix m) { RMatrix result = new RMatrix(m.GetnRows, m.GetnCols); for (int i = 0; i < m.GetnRows; i++) { for (int j = 0; j < m.GetnCols; j++) { result[i, j] = m[i, j] * d; } } return(result); }
public static RMatrix Trans(RMatrix m) { RMatrix matrix = new RMatrix(m.GetnRows, m.GetnCols); for (int i = 0; i < m.GetnCols; i++) { for (int j = 0; j < m.GetnRows; j++) { matrix[i, j] = m[j, i]; } } return(matrix); }
private static RMatrix Diag(RMatrix m) { for (int k = 0; k < m.GetnCols; k++) { for (int i = k + 1; i < m.GetnCols; i++) { double q = m[i, k] / m[k, k]; for (int j = 0; j < m.GetnRows; j++) { m[i, j] -= m[k, j] * q; } } } return(m); }
public static double Sumdiagonal(RMatrix m) { double summa = 0; for (int i = 0; i < m.GetnCols; i++) { for (int j = 0; j < m.GetnRows; j++) { if (i == j) { summa += m[i, j]; } } } return(summa); }
public static RMatrix operator -(RMatrix m1, RMatrix m2) { if (!RMatrix.CompareDimension(m1, m2)) { throw new Exception("Размеры двух матриц должны быть одинаковыми!"); } RMatrix result = new RMatrix(m1.GetnRows, m1.GetnCols); for (int i = 0; i < m1.GetnRows; i++) { for (int j = 0; j < m1.GetnCols; j++) { result[i, j] = m1[i, j] - m2[i, j]; } } return(result); }
public static double Determinant(RMatrix mat) { double result = 0.0; if (!mat.IsSquared()) { throw new Exception("The matrix must be squared!"); } if (mat.GetnRows == 1) { result = mat[0, 0]; } else { for (int i = 0; i < mat.GetnRows; i++) { result += Math.Pow(-1, i) * mat[0, i] * Determinant(RMatrix.Minor(mat, 0, i)); } } return(result); }
public static RMatrix Inverse(RMatrix m, uint round = 0) { if (m.GetnCols != m.GetnRows) { throw new ArgumentException("Обратная матрица существует только для квадратных, невырожденных, матриц."); } RMatrix matrix = new RMatrix(m.GetnRows, m.GetnCols); //Делаем копию исходной матрицы double determinant = Determinant(m); //Находим детерминант if (determinant == 0) { return(matrix); //Если определитель == 0 - матрица вырожденная } for (int i = 0; i < m.GetnRows; i++) { for (int t = 0; t < m.GetnCols; t++) { RMatrix tmp = RMatrix.Minor(m, i, t); //получаем матрицу без строки i и столбца t //(1 / determinant) * Determinant(tmp) - формула поределения элемента обратной матрицы matrix[t, i] = round == 0 ? (1 / determinant) * Math.Pow(-1, i + t) * Determinant(tmp) : Math.Round(((1 / determinant) * Math.Pow(-1, i + t) * Determinant(tmp)), (int)round, MidpointRounding.ToEven); } } return(matrix); }
static void Main(string[] args) { Console.WriteLine("\n\nЗадание Матрица\n\n"); RMatrix A = new RMatrix(3); RMatrix B = new RMatrix(3); Console.WriteLine("Объекты скопированны A-in C,B-in D"); RMatrix C = A.DeepCopy(); RMatrix D = B.DeepCopy(); string choice;//переменная ввода while (true) { Console.WriteLine("\n=======================\n"); Console.WriteLine("Matrix A:"); Console.WriteLine(A.ToString() + "\n"); Console.WriteLine("Matrix B:"); Console.WriteLine(B.ToString() + "\n"); Console.Write("Меню: \n " + "1 - сложить \n " + "2 - вычесть \n " + "3 - умножить \n " + "4 - сравнение \n " + "5 - детерминант А \n " + "6 - детерминант B \n " + "7 - обратная матрица A \n " + "8 - обратная матрица B \n " + "9 - использовать глубокое копирование матрицы A \n" + "0 - использовать глубокое копирование матрицы B \n" + "А - Введите матрицу у которой хотите узнать Хеш-Код \n" + "f - ВЫХОД ИЗ ПРОГРАММЫ \n " + "Ввод: "); choice = Console.ReadLine(); Console.Clear(); //проверка на выход if (choice == "exit") { Console.WriteLine("\n\n\n\nВЫХОД\n\n\n\n"); break; } switch (choice)//действия по нажатию { case "1": Console.WriteLine((A + B).ToString()); break; case "2": Console.WriteLine((A - B).ToString()); break; case "3": Console.WriteLine((A * B).ToString()); break; case "4": Console.WriteLine(A > B); break; case "5": Console.WriteLine(RMatrix.Determinant(A)); break; case "6": Console.WriteLine(RMatrix.Determinant(B)); break; case "7": Console.WriteLine(RMatrix.Inverse(B)); break; case "A": Console.WriteLine(A.GetHashCode()); break; case "B": Console.WriteLine(B.GetHashCode()); break; default: Console.WriteLine("Введено некорректное значение"); break; } } Console.ReadLine(); }
public RGrouping(RMatrix matrix, RColumnGroupings columnGroupings) : this() { this.Name = string.Format("{0}_ColumnGroup{1}", matrix.Name, columnGroupings.Count + 1); }
public RGrouping(RMatrix matrix, RRowGroupings rowGroupings) : this() { this.Name = string.Format("{0}_RowGroup{1}", matrix.Name, rowGroupings.Count + 1); }
public RMatrix(RMatrix m) { nRows = m.GetnRows; nCols = m.GetnCols; matrix = m.matrix; }
public bool Equals(RMatrix m) { return(matrix == m.matrix); }