Arrays 将二维数组映射为一维数组
为了好玩,我尝试在1D数组中表示2D数组。如何将二维数组映射到一维数组 例如,假设给我们一个数组:Arrays 将二维数组映射为一维数组,arrays,algorithm,Arrays,Algorithm,为了好玩,我尝试在1D数组中表示2D数组。如何将二维数组映射到一维数组 例如,假设给我们一个数组: char[][] 2dArray = new char[4][4]; 在二维空间中,范围(0,0),(2,2)将表示9个元素(以下用O表示): O、 O,O,X O、 O,O,X O、 O,O,X 十、 X,X,X 如果我们将二维数组表示为一维数组: char[] 1dArray = new char[16]; 它看起来是这样的: O, O, O, X, O, O, O, X, O, O,
char[][] 2dArray = new char[4][4];
在二维空间中,范围(0,0),(2,2)
将表示9个元素(以下用O表示):
O、 O,O,X
O、 O,O,X
O、 O,O,X
十、 X,X,X
如果我们将二维数组表示为一维数组:
char[] 1dArray = new char[16];
它看起来是这样的:
O, O, O, X, O, O, O, X, O, O, O, X, X, X, X, X
我已经知道,我可以通过公式找到一维数组中单个点的索引:(rows*x+y)
i、 e.在给定示例中,2d点(2,3)
将映射到1d索引11
给定一对2D坐标,如何将点的矩形截面映射到1D阵列?如果可能的话,我不喜欢使用循环嵌套 很容易,首先确定存储顺序(列主循环或行主循环),然后使用嵌套循环从2D矩阵
a
1D数组B
填充:
示例:
A
是一个NxM
矩阵
for i in
for j in M
B[i*M + j] = A[i][j]
很容易,首先确定存储顺序(列主循环或行主循环),然后使用嵌套循环从2D矩阵
a
1D数组B
:
示例:
A
是一个NxM
矩阵
for i in
for j in M
B[i*M + j] = A[i][j]
假设
字符的矩形2D数组如下:
const int xs=6;//柱
常数int ys=4;//排
字符dat2D_xy[xs][ys]=
{
“06ci”,
“17dj”,
“28ek”,
“39fl”,
“4agm”,
“5bhn”,
};
char dat2D_yx[ys][xs]=
{
"012345",
“6789ab”,
“cdefgh”,
“ijklmn”,
};
dat2D_xy[5][3]==dat2D_yx[3][5]==n';
然后,要将x,y
坐标转换为1D索引并返回,您可以使用:
i=x+(xs*y);
x=i%xs;
y=i/xs;
或者这个:
i=y+(ys*x);
x=i%ys;
y=i/ys;
不管是哪一个,它只是更改1D数组中项目的顺序。要将整个阵列复制到1D,您需要使用2个嵌套循环,或者只使用一个循环,并添加DMA或任何其他内存传输。大概是这样的:
O, O, O, X, O, O, O, X, O, O, O, X, X, X, X, X
inti,x,y;
字符dat1D[xs*ys];
对于(i=0,y=0;y让我们假设字符的矩形2D数组如下:
const int xs=6;//列
const int ys=4;//行
字符dat2D_xy[xs][ys]=
{
“06ci”,
“17dj”,
“28ek”,
“39fl”,
“4agm”,
“5bhn”,
};
char dat2D_yx[ys][xs]=
{
"012345",
“6789ab”,
“cdefgh”,
“ijklmn”,
};
dat2D_xy[5][3]==dat2D_yx[3][5]==n';
然后,要将x,y
坐标转换为1D索引并返回,您可以使用:
i=x+(xs*y);
x=i%xs;
y=i/xs;
或者这个:
i=y+(ys*x);
x=i%ys;
y=i/ys;
不管是哪一个,它只是更改1D数组中项目的顺序。要将整个数组复制到1D,您需要使用2个嵌套循环,或仅使用一个循环,并添加DMA或任何其他内存传输。类似于以下内容:
O, O, O, X, O, O, O, X, O, O, O, X, X, X, X, X
inti,x,y;
字符dat1D[xs*ys];
对于(i=0,y=0;y我认为如果您不想使用内塞德循环,您将需要一些语言功能。
这是我在python中的示例
首先,让我们创建一个维度为4x4
的列表a
,其中a[i][j]
是(i,j)
现在假设我们只需要从(1,1)
到(2,3)
的子矩阵。
首先让过滤器元素从第1行移动到第2行
rows=a[1:3]
然后我们得到第1列和第3列之间的元素,得到子矩阵
submatrix=[行[1:4]表示行中的行]
现在我们有了子矩阵,要将其转换为1d列表,我们可以使用sum
ans=sum(子矩阵,[])
最后,如果我们打印ans
,我们将
[(1,1)、(1,2)、(1,3)、(2,1)、(2,2)、(2,3)]
把这些东西组合在一起,我们就有了这个函数,a
是输入矩阵,p1
和p2
是定位子矩阵的输入点
def f(a, p1, p2):
x1, y1 = p1
x2, y2 = p2
return sum([row[y1:y2 + 1] for row in a[x1:x2 + 1]], [])
我认为,如果你不想要一个新的循环,你需要一些语言特性。
这是我在python中的示例
首先,让我们创建一个维度为4x4
的列表a
,其中a[i][j]
是(i,j)
现在假设我们只需要从(1,1)
到(2,3)
的子矩阵。
首先让过滤器元素从第1行移动到第2行
rows=a[1:3]
然后我们得到第1列和第3列之间的元素,得到子矩阵
submatrix=[行[1:4]表示行中的行]
现在我们有了子矩阵,要将其转换为1d列表,我们可以使用sum
ans=sum(子矩阵,[])
最后,如果我们打印ans
,我们将
[(1,1)、(1,2)、(1,3)、(2,1)、(2,2)、(2,3)]
把这些东西组合在一起,我们就有了这个函数,a
是输入矩阵,p1
和p2
是定位子矩阵的输入点
def f(a, p1, p2):
x1, y1 = p1
x2, y2 = p2
return sum([row[y1:y2 + 1] for row in a[x1:x2 + 1]], [])
如果没有嵌套循环和语言支持(还没有提到),这是可能的,但我怀疑它会更快(包含n行和m列的数组):
在这种情况下,最好以标准方式进行,在此处使用列表,因为我不知道结果的长度(如果可能为null,则添加null检查):
List List=new ArrayList();
对于(int i=0;i
如果没有嵌套循环和语言支持(之前没有提到),这是可能的,但我怀疑它会更快(包含n行和m列的数组):
在这种情况下,最好以标准方式进行,在这里使用列表,因为我不知道结果的长度(添加空检查)
List<Integer> list = new ArrayList<>();
for (int i = 0; i < arr2D.lengh; i++)
for (int j = 0; j < arr2D[i].length; j++)
list.add(arr2D[i][j]);