예제 #1
0
파일: Class1.cs 프로젝트: LoysMOBA/Lab3
            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);
            }
예제 #2
0
파일: Class1.cs 프로젝트: LoysMOBA/Lab3
            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);
            }
예제 #3
0
파일: Class1.cs 프로젝트: LoysMOBA/Lab3
            public RMatrix DeepCopy()
            {
                RMatrix clone = (RMatrix)this.MemberwiseClone();

                clone.nCols  = this.nCols;
                clone.nRows  = this.nRows;
                clone.matrix = this.matrix;
                return(clone);
            }
예제 #4
0
파일: Class1.cs 프로젝트: LoysMOBA/Lab3
 public static bool CompareDimension(RMatrix m1, RMatrix m2)
 {
     if (m1.GetnRows == m2.GetnRows && m1.GetnCols == m2.GetnCols)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
예제 #5
0
파일: Class1.cs 프로젝트: LoysMOBA/Lab3
            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);
            }
예제 #6
0
            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);
            }
예제 #7
0
 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);
 }
예제 #8
0
            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);
            }
예제 #9
0
파일: Class1.cs 프로젝트: LoysMOBA/Lab3
            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);
            }
예제 #10
0
파일: Class1.cs 프로젝트: LoysMOBA/Lab3
            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);
            }
예제 #11
0
파일: Class1.cs 프로젝트: LoysMOBA/Lab3
            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);
            }
예제 #12
0
        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();
        }
예제 #13
0
 public RGrouping(RMatrix matrix, RColumnGroupings columnGroupings)
     : this()
 {
     this.Name = string.Format("{0}_ColumnGroup{1}", matrix.Name, columnGroupings.Count + 1);
 }
예제 #14
0
 public RGrouping(RMatrix matrix, RRowGroupings rowGroupings) : this()
 {
     this.Name = string.Format("{0}_RowGroup{1}", matrix.Name, rowGroupings.Count + 1);
 }
예제 #15
0
파일: Class1.cs 프로젝트: LoysMOBA/Lab3
 public RMatrix(RMatrix m)
 {
     nRows  = m.GetnRows;
     nCols  = m.GetnCols;
     matrix = m.matrix;
 }
예제 #16
0
파일: Class1.cs 프로젝트: LoysMOBA/Lab3
 public bool Equals(RMatrix m)
 {
     return(matrix == m.matrix);
 }