static void Main()
        {
            // Підтримка Unicode
            Console.OutputEncoding = Encoding.Unicode;

            // для створення чогось умовно рандомного
            Random rnd = new Random();

            // створюємо масив відповідного типу
            MyMatrix <double> matrix = new MyMatrix <double>
                                           (rnd.Next(1, 10), rnd.Next(1, 10));

            // Заповнюємо матрицю значеннями
            for (int i = 0; i < matrix.Count.H; i++)
            {
                for (int j = 0; j < matrix.Count.W; j++)
                {
                    matrix[i, j] = rnd.Next(-9, 10);
                }
            }

            // виведення даних
            Console.WriteLine("\n\tЗгенерована матриця:\n");
            Console.WriteLine(matrix.ToString());

            // вирізати підматрицю
            var temp = matrix.CutOut(0, 0, matrix.Count.H / 2, matrix.Count.W / 2);

            // результат
            Console.WriteLine("\n\tВирізана підматриця:\n");

            // виведення даних
            Console.WriteLine(temp.ToString());

            // зміна розмірів внутрішнього масиву
            matrix.Change(matrix.Count.H / 2, matrix.Count.W / 2);

            // виведення даних
            Console.WriteLine("\n\tОбрізана матриця матриця:\n");
            Console.WriteLine(matrix.ToString());

            // збільшення розмірів
            matrix.Change(matrix.Count.H * 2, matrix.Count.W * 2);

            // виведення даних
            Console.WriteLine("\n\tЗбільшена матриця матриця:\n");
            Console.WriteLine(matrix.ToString());

            // repeat
            DoExitOrRepeat();
        }
        /// <summary>
        /// Вирізає підматрицю з матриці
        /// </summary>
        /// <param name="up">границя зверху</param>
        /// <param name="left">границя зліва</param>
        /// <param name="down">границя знизу</param>
        /// <param name="right">границя справа</param>
        public MyMatrix <T> CutOut(int up, int left, int down, int right)
        {
            // може бути момент коли задано дані вказані поза межами і буде помилка
            // зробимо автоматичне регулювання
            up    = Corect(up, Count.H);
            down  = Corect(down, Count.H);
            left  = Corect(left, Count.W);
            right = Corect(right, Count.W);

            int h = Math.Abs(down - up),        // рядки
                w = Math.Abs(right - left);     // колонки

            // щоб не було помилки, якщо буде ділення 1 на 2 і націло лишиться 0
            h = (h < 1) ? 1 : h;
            w = (w < 1) ? 1 : w;

            // створюємо тимчасову матрицю
            MyMatrix <T> temp = new MyMatrix <T>(h, w);

            // вирізаємо підматрицю (похідні) матриці з базової
            for (int i = 0; i < h; i++)
            {
                for (int j = 0; j < w; j++)
                {
                    // необхідно зробити захист від переплутування сторін, як приклад Math.Min(up, down)
                    temp[i, j] = arrays[Math.Min(up, down) + i, Math.Min(left, right) + j];
                }
            }

            return(temp);

            // внутрішня функція
            // value - задане користувачем значення межі обрізання матриці
            // limit - границя наявної матриці
            int Corect(int value, int limit)
            {
                return((value < 0) ? 0 : ((value > limit) ? limit : value));
            }
        }