Упростить метод сглаживания матрицы - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, помогите пожалуйста упростить программу. Задача состоит в том, что нужно провести операцию сглаживания над двумерным массивом 10 на 10. Операция сглаживания матрицы дает новую матрицу того же размера, каждый элемент которой получается как среднее арифметическое имеющихся соседей соответствующего элемента исходной матрицы. Мой метод решения получился очень большой, если можно его как-то сократить подскажите пожалуйста как
  public void sgMatrix() 
        {
            int kol = 0;
            for (int i = 1; i < 9; i++)
            {
                for (int j = 1; j < 9; j++)
                {
                   if (Mat[i - 1, j] != 0)
                   {
                        sgMat[i, j] += Mat[i - 1, j];
                        kol++;
                    }
                    if (Mat[i, j - 1] != 0)
                    { 
                        sgMat[i, j] += Mat[i, j - 1]; 
                        kol++; 
                    }
                    if (Mat[i + 1, j] != 0) 
                    { 
                        sgMat[i, j] += Mat[i + 1, j]; 
                        kol++; 
                    }
                    if (Mat[i, j + 1] != 0)
                    { 
                        sgMat[i, j] += Mat[i, j + 1];
                        kol++; 
                    }
                    sgMat[i, j] /= kol;
                    kol = 0;
                }
            }
            for (int i = 0; i < 9; i++)
            {
                for (int j = 0; j < 1; j++)
                {
                    if (Mat[i + 1, j] != 0)
                    {
                        sgMat[i, j] += Mat[i + 1, j];
                        kol++;
                    }
                    if (Mat[i, j + 1] != 0)
                    {
                        sgMat[i, j] += Mat[i, j+1];
                        kol++;
                    }
                    sgMat[i, j] /= kol;
                    kol = 0;
                }
            }
            for (int i = 0; i < 1; i++)
            {
                for (int j = 0; j < 9; j++)
                {
                    if (Mat[i + 1, j] != 0)
                    {
                        sgMat[i, j] += Mat[i + 1, j];
                        kol++;
                    }
                    if (Mat[i, j + 1] != 0)
                    {
                        sgMat[i, j] += Mat[i, j+1];
                        kol++;
                    }
                    sgMat[i, j] /= kol;
                    kol = 0;
                }
            } 
            for (int i = 9; i < 10; i++)
            {
                for (int j = 0; j < 9; j++)
                {
                    if (Mat[i - 1, j] != 0)
                    {
                        sgMat[i, j] += Mat[i - 1, j];
                        kol++;
                    }
                    if (Mat[i, j + 1] != 0)
                    {
                        sgMat[i, j] += Mat[i, j+1];
                        kol++;
                    }
                    sgMat[i, j] /= kol;
                    kol = 0;
                }
            }
            for (int i = 0; i < 9; i++)
            {
                for (int j = 9; j < 10; j++)
                {
                    if (Mat[i, j-1] != 0)
                    {
                        sgMat[i, j] += Mat[i, j - 1];
                        kol++;
                    }
                    if (Mat[i + 1, j] != 0)
                    {
                        sgMat[i, j] += Mat[i + 1, j];
                        kol++;
                    }
                    sgMat[i, j] /= kol;
                    kol = 0;
                }
            }
            for (int i = 9; i < 10; i++)
            {
                for (int j = 9; j < 10; j++)
                {
                    if (Mat[i - 1, j] != 0)
                    {
                        sgMat[i, j] += Mat[i - 1, j];
                        kol++;
                    }
                    if (Mat[i, j - 1] != 0)
                    {
                        sgMat[i, j] += Mat[i, j - 1];
                        kol++;
                    }
                    sgMat[i, j] /= kol;
                    kol = 0;
                }
            }
                Console.WriteLine();
            Console.WriteLine("Сглаженная матрица: ");
            Console.WriteLine();
            for (int i = 0; i < 10; i++)
            {
                for (int j = 0; j < 10; j++)
                {
                    Console.Write(Math.Round(sgMat[i, j], 1) + "\t");
                }
            }
        }

Решение задачи: «Упростить метод сглаживания матрицы»

textual
Листинг программы
        static void Main(string[] args)
        {
            int n = 10;
            int[,] mass = new int[n,n];
 
            Random rnd = new Random();
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < n; j++)
                {
                    mass[i,j] = rnd.Next(0, 9);
                }
            }
 
            Console.WriteLine("Заданная матрица");
            Print(mass);
            Console.WriteLine("Сглаженная матрица");
            Print(Smooth(mass));
            Console.ReadKey();
 
        }
        static int[,] Smooth(int[,] array)
        {
            var result = new int[array.GetLength(0), array.GetLength(1)];
            for (int i = 0; i < result.GetLength(0); i++)
            {
                for (int j = 0; j < result.GetLength(1); j++)
                {
                    result[i, j] = Average(array, i, j);
                }
            }
            return result;
        }
 
        static int Average(int[,] array, int i, int j)
        {
            int fromi = Math.Max(0, i - 1), toi = Math.Min(array.GetLength(0) - 1, i + 1);
            int fromj = Math.Max(0, j - 1), toj = Math.Min(array.GetLength(1) - 1, j + 1);
            int sum = 0, q = 0;
            for (int k = fromi; k < toi; k++)
            {
                for (int m = fromj; m < toj; m++)
                {
                    sum += array[i, j];
                    q++;
                }
            }
            return (sum - array[i, j]) / q;
        }
        static public void Print(int[,] arr)
        {
            for (int i = 0; i < arr.GetLength(1); i++)
            {
                for (int j = 0; j < arr.GetLength(0); j++)
                    Console.Write(string.Format("{0,3} ", arr[i, j]));
                Console.WriteLine();
            }
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5
Похожие ответы