![](/img/trans.png)
[英]Need help iterating through smaller 2D "subarrays" found in larger 2D array
[英]Splitting a 2D array into smaller equally sized 2D subarrays
基本上,我要问的是一个正方形的2D数组和一个有效的补丁大小(2D子数组的大小),我将如何去做。 最终,我不需要以任何方式存储子数组,我只需要找到每个子数组的中值并将它们存储在一维数组中即可。 中位数和存储到新数组对我来说很简单,我只是不知道如何处理原始2D数组并将其正确拆分。 我已经尝试了几次,并且不断越界错误。 我有一个4x4:
[1,2,3,4] [2,3,4,1] [3,4,1,2] [4,1,2,3]
我需要像这样拆分
[1,2] [3,4] [2,3] [4,1]
[3,4] [1,2] [4,1] [2,3]
然后取每个的中位数并将其存储到新的一维数组中。
编辑:解决了,谢谢您的帮助!
您可以Arrays.copyOfRange(Object[] src, int from, int to)
使用Arrays.copyOfRange(Object[] src, int from, int to)
:
src
是源1D
数组
from
是要复制的范围的初始索引,包括端点。
to
是要复制的范围的最终索引(不包括)。
我不喜欢您的代码,因为似乎时间复杂度太高。
试试下面的代码:
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
不为0
即维不能被patch
值整除,则if
条件int a[] = Arrays.copyOfRange(arr[i], from, to);
控制索引范围。 希望您知道这一点。
输出量
[1, 2]
[3, 4]
[2, 3]
[4, 1]
[3, 4]
[1, 2]
[4, 1]
[2, 3]
我认为可以进行类似的操作,尽管我没有对其进行测试,但是它应该可以使您很好地了解如何进行此扫描
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.