@lycyfer

Умножение матриц алгоритмом Штрассена?

class Strassen
    {

        static void Main(string[] args)
        {
            Strassen s = new Strassen();
            Console.WriteLine("Введите количество строк");
            int size =Convert.ToInt32(Console.ReadLine());
           
            //while (size % 4 != 0)//создание матрицы подходящего размера
            //{
            //    size++;
            //}
            Random rnd = new Random();

            int[,] a = new int[size, size];
            int[,] b = new int[size, size];
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {

                    a[i, j] = rnd.Next(0, 32);
                }
            }
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {

                    b[i, j] = rnd.Next(0, 32);
                }
            }
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    if (a[i, j] < 10 && a[i, j] > -10) Console.Write(" " + a[i, j] + "  ");
                    else Console.Write(" " + a[i, j] + " ");
                }
                Console.WriteLine();
            }
            Console.WriteLine();
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    if (b[i, j] < 10 && b[i, j] > -10) Console.Write(" " + b[i, j] + "  ");
                    else Console.Write(" " + b[i, j] + " ");
                }
                Console.WriteLine();
            }
            Console.WriteLine();
            
            int[,]C= s.Multiplay(a, b, size);
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    if (C[i, j] < 10 && C[i, j] > -10) Console.Write(" " + C[i, j] + "  ");
                    else Console.Write(" " + C[i, j] + " ");
                }
                Console.WriteLine();
            }
            Console.ReadKey();

        }
        //Метод Сложения 
        public int[,] add(int[,] A, int[,] B, int size)
        {
            int[,] C = new int[size/2, size/2];
            for (int i = 0; i < size/2 ; i++)
            {
                for (int j = 0; j < size/2; j++)
                {
                    C[i, j] = A[i, j] + B[i, j];
                }
            }
            return C;
        }
        //Метод разложения
        public void split(int[,] P, int[,] C, int iB, int jB, int size)
        {

            for (iB = 0; iB < size / 2; iB ++)
            {
                for (jB = 0; jB < size / 2; jB ++)
                {
                    for (int i = iB; i < size/2 ; i++)
                    {
                        for (int j = jB; j < size/2; j++)
                        {
                            
                                C[i, j] = P[iB, jB];
                            
                        }
                    }
                }

            }
        }
        
        public void join(int[,] C, int[,] P, int iB, int jB, int size)
        {

            for (int i1 = 0, i2 = iB; i1 < size; i1++, i2++)
            {
                for (int j1 = 0, j2 = jB; j1 < size ; j1++, j2++)
                {

                    P[i2, j2] = C[i1, j1];
                }
            }
        }
        //Метод вычитания 
        public int[,] sub(int[,] A, int[,] B, int size)
        {

            int[,] C = new int[size, size]; ;
            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < size; j++)
                {
                    C[i, j] = A[i, j] - B[i, j];
                }
            }
            return C;
        }
        //Алгоритм Штрассена
        public int[,] Multiplay(int[,] A, int[,] B, int size)
        {
            int n = size;
            int[,] C = new int[size,size];
            if (n == 2)
            {
                C[0, 0] = A[0, 0] * B[0, 0];
            }
            else
            {
                int[,] A11 = new int[n / 2, n / 2];
                int[,] A12 = new int[n / 2, n / 2];
                int[,] A21 = new int[n / 2, n / 2];
                int[,] A22 = new int[n / 2, n / 2];
                int[,] B11 = new int[n / 2, n / 2];
                int[,] B12 = new int[n / 2, n / 2];
                int[,] B21 = new int[n / 2, n / 2];
                int[,] B22 = new int[n / 2, n / 2];


                split(A, A11, 0, 0, size);
                split(A, A12, 0, 2, size);
                split(A, A21, n / 2, 0, size);
                split(A, A22, n / 2, n / 2, size);


                split(B, B11, 0, 0, size);
                split(B, B12, 0, n / 2, size);
                split(B, B21, n / 2, 0, size);
                split(B, B22, n / 2, n / 2, size);


                int[,] M1 = Multiplay(add(A11, A22, size), add(B11, B22, size), size);
                int[,] M2 = Multiplay(add(A11, A22, size), B11, size);
                int[,] M3 = Multiplay(A11, sub(B12, B22, size), size);
                int[,] M4 = Multiplay(A22, sub(B21, B11, size), size);
                int[,] M5 = Multiplay(add(A11, A12, size), B22, size);
                int[,] M6 = Multiplay(sub(A21, A11, size), add(B11, B12, size), size);
                int[,] M7 = Multiplay(sub(A12, A22, size), add(B21, B22, size), size);


                int[,] C11 = add(sub(add(M1, M4, size), M5, size), M7, size);
                int[,] C12 = add(M3, M5, size);
                int[,] C21 = add(M2, M4, size);
                int[,] C22 = add(sub(add(M1, M3, size), M2, size), M6, size);


                join(C11, C, 0, 0, size);
                join(C12, C, 0, n / 2, size);
                join(C21, C, n / 2, 0, size);
                join(C22, C, n / 2, n / 2, size);
            }
            return C;
        }
    }
}
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы