如何在 java 中将二维数组拆分为多个不同大小的二维数组

how to split a 2d array into multiple 2d arrays of different sized in java

我有一个 6*6 的二维数组 pixels

  int [][] pixels = { {1,2,7,9,4,11},
                    {3,4,6,6,12,12},
                    {4,9,15,14,9,9},
                    {10,10,20,18,8,8},
                    {4,3,17,16,1,4},
                    {4,5,18,18,5,6}
            };

我想将其数据存储到 9 个大小为 2*2 的二维数组中,如下所示

 int [][] array1 = {{1,2},
            {3,4}
    };

    int [][] array2 = {{7,9},
            {6,6}
    };

    int [][] array3 = {{4,11},
            {12,12}
    };

像这样,我有另一个大小为 320 * 320 的二维数组,我想将其数据存储在 6400 个大小为 44 的二维数组中,我不知道什么是动态的做。我的 for 循环不正确。谁能帮忙? 编辑:我试过这段代码,它给了我正确的结果,重新分级了二维数组的第一个数组,但我不确定第二个。 vectorHeight 为 4。大的 2d 数组大小为 320 320,较小的大小为 4 * 4

for(int j=0; j < 320  ; j++){
            for(int i=0; i< 320 ; i++){
                int[][] array = new int[][]{
                        {pixels2[j * vectorHeight][i * vectorHeight], pixels2[j * vectorHeight][(i * vectorHeight) + 1],pixels2[j * vectorHeight][(i * vectorHeight) + 2],pixels2[j * vectorHeight][(i * vectorHeight) + 3]},
                        {pixels2[(j * vectorHeight) + 1][i * vectorHeight], pixels2[(j * vectorHeight) + 1][(i * vectorHeight) + 1],pixels2[(j * vectorHeight) + 2][(i * vectorHeight) + 2],pixels2[(j * vectorHeight) + 3][(i * vectorHeight) + 3]},
                };
                         System.out.println(Arrays.deepToString(array));
                }
            }

edit2:320 * 320 二维数组是获取图像和 return 像素向量的函数的结果,因此这是读取图像的代码:

public static int[][] readImage(String filePath) {
        File file = new File(filePath);
        BufferedImage image = null;
        try {
            image = ImageIO.read(file);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        int width = image.getWidth();
        int height = image.getHeight();
        int[][] pixels = new int[height][width];
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                int p = image.getRGB(x, y);
                int a = (p >> 24) & 0xff;
                int r = (p >> 16) & 0xff;
                int g = (p >> 8) & 0xff;
                int b = p & 0xff;

                pixels[y][x] = r;

                p = (a << 24) | (r << 16) | (g << 8) | b;
                image.setRGB(x, y, p);
            }

        }

        return pixels;
    }

我目前正在处理的图像就是这张https://www.researchgate.net/profile/Ayman-Al-Dmour/publication/304496637/figure/fig1/AS:377628822392833@1467045135613/Test-images_Q320.jpg 其余代码是一个函数,它获取图像、矢量大小 - 高度和重量 - 并最终假设使用矢量量化来压缩它

int [][] pixels = readImage(filePath);
int numofVectors1 = (pixels.length * pixels.length) / (vectorHeight * vectorWidth);
        ArrayList<int[][]> vectors = new ArrayList<>(numofVectors1);
         for (int j = 0; j < pixels.length; j++) {
                for (int i = 0; i < pixels.length; i++) {
                    int[][] array = new int[][]{
                            {pixels[j * vectorHeight][i * vectorHeight], pixels[j * vectorHeight][(i * vectorHeight) + 1], pixels[j * vectorHeight][(i * vectorHeight) + 2], pixels[j * vectorHeight][(i * vectorHeight) + 3]},
                            {pixels[(j * vectorHeight) + 1][i * vectorHeight], pixels[(j * vectorHeight) + 1][(i * vectorHeight) + 1], pixels[(j * vectorHeight) + 1][(i * vectorHeight) + 2], pixels[(j * vectorHeight) + 1][(i * vectorHeight) + 3]},
                    };
                    vectors.add(array);
                }

        }

在你的情况下,写下你想要的内容会很有帮助:

         [0][0] [0][1] [1][0] [1][1]
         [0][2] [0][3] [1][2] [1][3]
         [0][4] [0][5] [1][4] [1][5]

         [2][0] [2][1] [3][0] [3][1]
         [2][2] [2][3] [3][2] [3][3]
         [2][4] [2][5] [3][4] [3][5]

         [4][0] [4][1] [5][0] [5][1]
         [4][2] [4][3] [5][2] [5][3]
         [4][4] [4][5] [5][4] [5][5]

也许您已经可以在这里看到一个模式。 首先,我为前三行创建了内部循环:

for (int i = 0; i < 3; i++) {
    int[][] array = new int[][]{
            {pixels[0][i * 2], pixels[0][(i * 2) + 1]},
            {pixels[1][i * 2], pixels[1][(i * 2) + 1]}
    };
    System.out.println(Arrays.deepToString(array));
}

如您所见,前三行始终是第零行和第一行。 在接下来的三行中,它始终是第二行和第三行。 所有列的规则是它始终为零、二、四和一、三、五。

于是进入嵌套循环:

for (int j = 0; j < 3; j++) {
    for (int i = 0; i < 3; i++) {
        int[][] array = new int[][]{
            {pixels[j * 2][i * 2], pixels[j * 2][(i * 2) + 1]},
            {pixels[(j * 2) + 1][i * 2], pixels[(j * 2) + 1][(i * 2) + 1]}};
        System.out.println(Arrays.deepToString(array));
    }
}

现在您可以将创建的数组存储在列表中。

编辑

对不起,我想我弄错了。这应该做你想做的: 创建 6400 个 4x4 阵列。所以你必须循环直到你想要的数组数量的平方根(在本例中为 6400)。 您现在有可能检查数组是否正确吗? 试试这个:

int vectorHeight = 4, vectorWidth = 4;
int numofVectors1 = (pixels.length * pixels.length) / (vectorHeight * vectorWidth);
ArrayList<int[][]> vectors = new ArrayList<>(numofVectors1);
int numberOfArrays = 6400;
        for (int j = 0; j < Math.sqrt(numberOfArrays); j++) {
            for (int i = 0; i < Math.sqrt(numberOfArrays); i++) {
                int[][] array = new int[][]{
                        {
                                pixels[j * vectorHeight][i * vectorHeight],
                                pixels[j * vectorHeight][(i * vectorHeight) + 1],
                                pixels[j * vectorHeight][(i * vectorHeight) + 2],
                                pixels[j * vectorHeight][(i * vectorHeight) + 3]
                        },
                        {
                                pixels[(j * vectorHeight) + 1][i * vectorHeight],
                                pixels[(j * vectorHeight) + 1][(i * vectorHeight) + 1],
                                pixels[(j * vectorHeight) + 1][(i * vectorHeight) + 2],
                                pixels[(j * vectorHeight) + 1][(i * vectorHeight) + 3]
                        },
                        {
                                pixels[(j * vectorHeight) + 2][i * vectorHeight],
                                pixels[(j * vectorHeight) + 2][(i * vectorHeight) + 1],
                                pixels[(j * vectorHeight) + 2][(i * vectorHeight) + 2],
                                pixels[(j * vectorHeight) + 2][(i * vectorHeight) + 3]
                        },
                        {
                                pixels[(j * vectorHeight) + 3][i * vectorHeight],
                                pixels[(j * vectorHeight) + 3][(i * vectorHeight) + 1],
                                pixels[(j * vectorHeight) + 3][(i * vectorHeight) + 2],
                                pixels[(j * vectorHeight) + 3][(i * vectorHeight) + 3]
                        },
                };
                vectors.add(array);
            }
        }