将2D数组拆分为4个较小的2D数组

时间:2018-11-06 18:28:57

标签: c# arrays for-loop

我需要遍历一个4x4的2d整数数组,但是我还必须从中创建4个2x2数组。然后,我必须遍历这4个2x2数组中的每一个,以挑选出每个2x2数组中数字的平均值。

    public int[,] Reduced(Sampler sampler)
    {
        int[,] a = new int[SampleSize,SampleSize];

        for (int r = 0; r < Math.Sqrt(image.Length); r+=SampleSize)
        {
            for (int c = 0; c < Math.Sqrt(image.Length); c+=SampleSize)
            {
                InsideLoop(a, r, c);                                   
            }
        }
        return a;
    }

    private void InsideLoop(int[,] a, int r, int c)
    {
        for (r = 0; r < SampleSize; r++)
        {
            for (c = 0; c < SampleSize; c++)
            {
                a[r, c] = image[r, c];
                Console.WriteLine("Value: {0}", a[r, c]);
            }
        }
    }

从本质上讲,这是我到目前为止所取得的成就,但是它是如何编写的而不是我希望它如何工作。对于此示例,SampleSize是一个设置为2的变量。当前执行的操作是打印出四次创建第一个2x2数组的数字。我的笔记本电脑电池快要用完了,所以我不能再详细说明了,但是如果有人在我开车回家时有任何提示。我必须完成将其发布到手机上。

2 个答案:

答案 0 :(得分:1)

这行吗?

int sampleSize = 2;
int[,] data = {
    {1, 2, 3, 4 },
    {5, 6, 7, 8 },
    {9, 10, 11, 12 },
    {13, 14, 15, 16 }
};

//assume input data is a perfect square as per your example
int max = (int)Math.Sqrt(data.Length);

List<int[,]> samples = new List<int[,]>();

int startX = 0;
while (startX + sampleSize <= max)
{
    int startY = 0;
    while (startY + sampleSize <= max)
    {
        int[,] sample = new int[sampleSize, sampleSize];
        for (int x = 0; x < sampleSize;x++)
        {
            for (int y = 0; y < sampleSize; y++)
            {
                sample[x, y] = data[x + startX, y + startY];
            }
        }
        samples.Add(sample);
        startY += sampleSize;
    }
    startX += sampleSize;
}

//for output testing
foreach (int[,] sample in samples)
{
    Console.WriteLine(sample[0, 0].ToString().PadLeft(2) + " | " + sample[0, 1]);
    Console.WriteLine(" -----  ");
    Console.WriteLine(sample[1, 0].ToString().PadLeft(2) + " | " + sample[1, 1]);
    Console.WriteLine();
    Console.WriteLine();

}
Console.ReadLine();

这是输出

 1 | 2
 -----  
 5 | 6


 3 | 4
 -----  
 7 | 8


 9 | 10
 -----  
13 | 14


11 | 12
 -----  
15 | 16

答案 1 :(得分:0)

通用版本:

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        int[,] original = new int[,] { {  1,  2,  3,  4 }, 
                                       {  5,  6,  7,  8 }, 
                                       {  9, 10, 11, 12 }, 
                                       { 13, 14, 15, 16 } };

        int[,] harder = new int[,] { {  1,  2,  3,  4,  5,  6,  7,  8,  9 },
                                     { 10, 11, 12, 13, 14, 15, 16, 17, 18 },
                                     { 19, 20, 21, 22, 23, 24, 25, 26, 27 },
                                     { 28, 29, 30, 31, 32, 33, 34, 35, 36 },
                                     { 37, 38, 39, 40, 41, 42, 43, 44, 45 },
                                     { 46, 47, 48, 49, 50, 51, 52, 53, 54 },
                                     { 55, 56, 57, 58, 59, 60, 61, 62, 63 },
                                     { 64, 65, 66, 67, 68, 69, 70, 71, 72 },
                                     { 73, 74, 75, 76, 77, 78, 79, 80, 81 } };

        IterateArray(original);
        Console.ReadLine();
    }

    static void IterateArray(int[,] array)
    {
        double tDim = Math.Sqrt(Math.Sqrt(array.Length));
        int dim = (int)tDim;
        if (dim != tDim) throw new ArgumentException("Not a valid array!");

        for (int i = 0; i < dim; i++)
        {
            IterateRows(array, dim, i);
        }
    }

    static void IterateRows(int[,] array, int dim, int pass)
    {
        int maxRow = dim * dim;
        IList<int> list = new List<int>(maxRow);
        for (int curRow = 0; curRow < maxRow; curRow++)
        {
            IterateColumns(array, dim, curRow, pass, list);
            if (list.Count == maxRow)
            {
                PrintNewArray(list, dim);
                list.Clear();
            }
        }
    }

    static void IterateColumns(int[,] array, int dim, int row, int pass, IList<int> list)
    {
        int maxCol = dim + (dim * pass);
        for (int curCol = pass * dim; curCol < maxCol; curCol++)
        {
            list.Add(array[row, curCol]);
        }
    }

    static void PrintNewArray(IList<int> list, int dim)
    {
        for(int i = 0; i < list.Count; i++)
        {
            if (i % dim == 0)
            {
                Console.WriteLine();
            }
            Console.Write($"{list[i]} ");
        }
        Console.WriteLine($"\nAverage {list.Average()}");
    }
}