Arrays 将二维数组映射为一维数组

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,

为了好玩,我尝试在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, 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]);