当前位置: 首页 > 知识库问答 >
问题:

将2D数组拆分为大小相同的更小的2D子数组

宣滨海
2023-03-14

基本上,我要问的是给定一个正方形2D阵列和一个有效的补丁大小(2D子阵列的大小),我将如何做到这一点。最终,我不需要以任何方式存储子阵列,我只需要找到每个子阵列的中值并将它们存储在一个一维阵列中。中值和存储到新阵列对我来说很简单,我只是不知道如何处理原始2D阵列并正确拆分它。我已经尝试了几次,但一直出现越界错误。我有一个4x4:

[1,2,3,4] [2,3,4,1] [3,4,1,2]

我需要像这样拆分它

< code>[1,2] [3,4] [2,3] [4,1]

<代码>[3,4][1,2][4,1][2,3]

然后取每个的中位数并将它们存储到一个新的1D数组中。

编辑:解决了,感谢您的帮助!

共有2个答案

杭英杰
2023-03-14

我想像这样的东西可以做,虽然我没有测试它,但它应该会让你对如何进行扫描有一个很好的想法

public int[] patchArray(int[][] img, int patch)
{
    int size = img.length * (img[0].length / patch) ;
    int[] pArray = new int[size];
    int[] tmp = new int[patch];

    for (int row_i = 0; row_i < img.length; row_i++)
    {
        for (int patch_start = 0; patch_start < img[i].length; patch_start += patch)
        {
            int x = 0;
            for (int patch_i = patch_start; patch_i < (patch_start + patch); patch_i++)
            {
                tmp[patch_i - patch_start] = img[row_i][patch_i];
            }

            calculateMedian(tmp);
        }
    }

    return pArray;
}
申屠洛华
2023-03-14

您可以使用< code > arrays . copy of range(Object[]src,int from,int to)进行此操作,其中:

src是源1Darray

< code>from是要复制的范围的初始索引。

是要复制的范围的最终索引,不包括在内。

我不喜欢你的代码,因为它的时间复杂度太高了。

试试下面的代码:

public class Temp {
    public static void main(String[] args) {
        int[][] arr = { { 1,2,3,4 },
                        { 2,3,4,1 },
                        { 3,4,1,2 },
                        { 4,1,2,3 } };

        int patch = 2;

        splitToSubArrays(arr, patch);

    }

    static void splitToSubArrays(int arr[][], int patch) {
        for (int i = 0; i < arr[0].length; i++) {
            int to = patch;
            for (int from = 0; to <= arr.length;) {
                int a[] = Arrays.copyOfRange(arr[i], from, to);
                // instead of printing you can store in a separate array for later usage
                System.out.println(Arrays.toString(a));
                to += patch;
                from += patch;
            }
        }
    }

}

编辑:注意:对于N*N数组,如果N%patch值整除,那么如果condition here 来控制索引绑定。希望你知道这一点。

输出

[1, 2]
[3, 4]
[2, 3]
[4, 1]
[3, 4]
[1, 2]
[4, 1]
[2, 3]
 类似资料:
  • 我有一个由图像像素组成的2D数组,其大小取决于输入图像的大小。我需要将其分解为更小的9x9数组。为了给出更清晰的图片,我尝试说明情况: //smallerArray的行数和列数如下:它应该从imagePixels数组中复制它们,每8列迭代一次,然后再移动到下8行。 我已经完成了以下代码,但无法正确理解我的逻辑。如何停止迭代: 向上复制到第9列或第9行,将其存储在数组中,继续复制到第10列/第10行

  • 我有一个子阵列: 我想将每个子数组的元素放入另一个数组中,但子数组大小的总和必须小于或等于6。所以我想得到这样的东西 我现在的代码是 我被困在这里,因为我的代码只有两个前元素。原始数组有大约1000个子数组,我的代码没有以那种形式分割它。

  • 问题内容: 我想输出二维数组的最大值和最小值。Max可以很好地工作,但是即使在数组中没有零的情况下min也总是输出零。在本例中,我设置为99以防止较小的机会在数组中获得零。继承人完整代码: 问题答案: 由于您在中选择随机值的方式,不会存在小于零的值- 但也无法保证任何值都将恰好为零。但是,您将初始化为零,因为这是数组元素的默认值;没有什么比这更小了,所以答案总是零。 您应该在标记为“查找最小值”的

  • 我有一个具有相同键值uid的多维数组。我想把它转换成子数组通过限制Foreachloop.you可以看到两个uid有值100和两个uid有值5465 我想得到这样的阵列。 我可以不使用foreach循环得到结果吗?

  • 问题内容: 当每个块的总和大致相等时,如何将数组分成两个块? 问题答案: 像这样: 测试:

  • 我有一个2D数组 行数=H 列数=W 2d数组本身=arr 它们都是整数 我的任务是返回从第一行的每个点开始的垂直线的最小和 输入 输出12 我曾想过使用递归来解决这个问题,但没有得到正确的结果。 函数取数组,我要计算的最小和的位置是(应该在第一行,因为它是一行)列数和行数,res是返回res的和,res在主函数中由arr在x行和y列初始化 我对这个想法很有把握,但我的总结方式可能是错误的