масштабирование двумерного массива с заполнением (масштабирование матриц)

Предположим у меня есть массив int[3,3] или даже bool[3,3], где элементы выглядят так:

|0 1 0|
|0 0 0|
|0 0 0|

Мне нужно на его основе получить второй массив допустим размером 9х9

|0 0 0 1 1 1 0 0 0|
|0 0 0 1 1 1 0 0 0|
|0 0 0 1 1 1 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|

Который по сути является более "Детализованной" версией своего предшественника. Естественно в исходном массиве расположение единицы может быть где угодно, и она может быть даже не одна. Я только начал изучение данного направления, и не удивлюсь если что-то подобное можно реализовать с помощью какой-нибудь библиотеки допустим так: myMatrix.scale(x,y) Я нашел некий класс Matrix в System.Drawing.Drawing2D но похоже он служит для других целей

В массиве может быть только 0 и 1. Коэффициент увеличения только целочисленный от двух до трех раз, не больше, результируюшая матрица должна иметь идентичные с исходной соотношения сторон.


Ответы (2 шт):

Автор решения: Andrew

я сделал ответ на основе не двухмерного массива, а на основе вложенного массива. Но в во вложенный массив можно ложить двухмерный массив если что.

public int[][] EnlargeArray(int[][] arr, int times) 
{
   var lst = new List<int>();

   foreach(var row in arr) 
   {
       var tmp = enlargeRow(row, times);
       
       // дублирование полученной строки times раз
       for(int i = 0; i < times; i++)
       {
           lst.Add(tmp);
       }
   }

   return lst.ToArray();
}

public int[] enlargeRow(int[] arr, times) {
   var lst = List<int>();

   // генерация одной строки
   for (int i = 0; i <= arr.Length; i++)
   {
        // дублирование times раз
        for (int t = 0; t < times; t++)
        {
            lst.Add(arr[i]);
        }
    }

    return lst.ToArray();
}

Код писал из головы поэтому могут быть мелкие логические и синтаксические ошибки.

→ Ссылка
Автор решения: aepot

Простое деление индексов на коэффициент может решить задачу.

static void Main(string[] args)
{
    int[,] matrix = new[,]
    {
        { 0, 1, 0 },
        { 0, 0, 0 },
        { 0, 0, 0 }
    };
    PrintMatrix(matrix);
    int[,] scaledMatrix = Scale(matrix, 3);
    Console.WriteLine();
    PrintMatrix(scaledMatrix);
    Console.ReadKey();
}

static int[,] Scale(int[,] matrix, int scale)
{
    int[,] result = new int[matrix.GetLength(0) * scale, matrix.GetLength(1) * scale];
    for (int i = 0; i < result.GetLength(0); i++)
    {
        for (int j = 0; j < result.GetLength(1); j++)
        {
            result[i, j] = matrix[i / scale, j / scale];
        }
    }
    return result;
}

static void PrintMatrix(int[,] matrix)
{
    for (int i = 0; i < matrix.GetLength(0); i++)
    {
        Console.Write("|");
        for (int j = 0; j < matrix.GetLength(1); j++)
        {
            Console.Write(matrix[i, j]);
            if (j < matrix.GetLength(1) - 1)
                Console.Write(" ");
        }
        Console.WriteLine("|");
    }
}

Вывод в консоль

|0 1 0|
|0 0 0|
|0 0 0|

|0 0 0 1 1 1 0 0 0|
|0 0 0 1 1 1 0 0 0|
|0 0 0 1 1 1 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
|0 0 0 0 0 0 0 0 0|
→ Ссылка