如何在 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);
}
}
我有一个 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);
}
}