如何将M维数组转换为N维数组?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将M维数组转换为N维数组?相关的知识,希望对你有一定的参考价值。

arr2D[i][j]arr1D[i * k + j]的启发,我想知道一种可以更改任何数组尺寸的算法。

让我尝试将其正式化:

输入:

  1. M维容器A

  2. 容器的尺寸D(尺寸)

  3. 目标尺寸N

输出:

如果N > 0则返回内容与B相同的N维容器A,否则返回错误代码。

注意:

您可以为N维容器选择任何最佳尺寸。

我比其他某种语言的算法或代码更好地理解C ++或C代码。但是只要您能用英语理解,您就可以用任何语言帮助我好奇心:P

编辑:

我不需要任何完全有效的代码。我只是在问解决这个问题的方法。预先感谢您的任何好主意。

答案

您原始的M维容器是A

我们想创建一个新的N维容器B,它将容纳A的所有内容。

首先,我们必须找出一个映射,在该映射中我们可以轻松地在AB中找到相同的元素。

让我们使用一些示例来推断映射的方式:

((1) M = 2,N = 1

A: a * b    B: c
we can set the dimension c to be a * b, thus we have
A[i][j] = B[i * c + j]

((2) M = 3,N = 1

A: a * b * c    B: d
d = a * b * c
A[i][j][k] = B[(i * b * c) + (j * c) + k]

((3) M = 3,N = 2

A: a * b * c    B: d * e
d = a, e = b * c
A[i][j][k] = B[i][j * c + k]

((4) M = 4,N = 1

A: a * b * c * d    B: e
e = a * b * c * d
A[i][j][k][l] = B[(i * b * c * d) + (j * c * d) + (k * d) + l]

((5) M = 5,N = 4

A: a * b * c * d * e    B: u * v * w * x
u = a, v = b, w = c, x = d * e
A[i][j][k][l][m] = B[i][j][k][(l * e) + m]

((6) M = 5,N = 2

A: a * b * c * d * e    B: f * g
f = a, g = b * c * d * e
A[i][j][k][l][m] = B[i][(j * c * d * e) + (k * d * e) + (l * e) + m]

如果A具有M个尺寸a1,a2,...,aM,而B具有N个尺寸b1,b2,...,bN,我们可以这样说:

如果M> N,则对于所有0

通过这种方式,我们知道如何创建B及其每个尺寸的大小。

使用示例中显示的映射功能,您可以轻松地将任何M维矩阵转换为N维矩阵。

如果为M < N,则可以执行相同的操作,但方向相反。

另一答案

因为您不需要代码,所以让我解释一下如何使用模板。

假设您有一个尺寸为n_ {0},...,n_ {d-1}的D维数组,您始终可以通过将两个尺寸乘以两个尺寸相乘来删除一个尺寸。示例:a [5] [4] [3]包含60个元素,因此b [20] [3]或c [5] [12](在简单情况下,因为您甚至可以构造d [15] [4]和任何排列)都可以轻松地包含与a相同的元素,索引的映射也非常明显...

现在使用C ++进行操作要棘手得多,但是您将需要:可变参数模板和模板元编程。

可变参数模板定义您喜欢的任何维的数组类型,而模板元编程定义一个运算符,以将D维数组映射到N维数组。 (我可能会说这并不容易,但是在模板元编程中是非常困难的练习)。

另一答案

因此,您只想在不更改数据的情况下重新格式化矩阵。正如我在评论中所暗示的那样,最简单的方法是使用一维数组中间步骤将M维转换为N维。

这里的其他答案都在同一轨道上,但缺乏完整的数学知识……它们只是一个小例子,没有通用方程,因此这里是:

要在A[A0][A1]...[A(M-1)]X[A0*A1*...*A(M-1)]之间转换,其中A0,A1,...A(M-1)是容器的尺寸大小(分辨率),只需执行以下操作:

// M-D -> 1D
x = a0
   +a1*A0
   +a2*A0*A1
   ...
   +a(M-1)*A0*A1*...*A(M-2);

// 1D -> M-D   
q=x;
a0 = q%A0; q/=A0;
a1 = q%A1; q/=A1;
a2 = q%A2; q/=A2;
...
a(M-1) = q%A(M-1); q/=A(M-1);

其中a0,a1,...a(M-1)x是数组中的索引。

您实际上不需要将M-D数组转换为1D,然后又返回N-D就足以转换索引,因此:

for (a0=0;a0<A0;a0++)
 for (a1=0;a1<A1;a1++)
  ...
   for (a(M-1)=0;a(M-1)<A(M-1);a(M-1)++)
      {
      // M-D -> 1D
      x = a0
         +a1*A0
         +a2*A0*A1
         ...
         +a(M-1)*A0*A1*...*A(M-2);
      // 1D -> N-D   
      q=x;
      b0 = q%B0; q/=B0;
      b1 = q%B1; q/=B1;
      b2 = q%B2; q/=B2;
      ...
      b(N-1) = q%B(N-1); q/=B(N-1);
      // copy A -> B
      B[b0][b1]...[b(N-1)] = A[A0][A1]...[A(M-1)];
      }

不要忘记尺寸必须是:

A0*A1*...*A(M-1) <= B0*B1*...*B(N-1)

否则,您将无法访问数组,因为A中的数据将不适合B

如果获得动态尺寸,则可以使用:

另一答案

将[100]转换为[10] [10]:

nested_for

以上是关于如何将M维数组转换为N维数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个单维数组转换为一个多维数组 - PHP

PHP将单维数组转换为嵌套数组

java 2维数组如何转换为HashMap

将 3 维字节数组转换为单字节数组 [关闭]

如何在keras中将三维数组转换为五维数组[重复]

如何在 Numpy 中“压缩”几个 N-D 数组?