首页 > 解决方案 > 如何将 M 维数组转换为 N 维数组?

问题描述

受启发arr2D[i][j]arr1D[i * k + j]在阅读了这篇文章及其下的评论之后,我想知道一种可以改变任何数组维度的算法。

让我尝试将其形式化:

输入:

  1. M维容器A

  2. 容器尺寸D(大小)

  3. 目标维度N

输出:

如果then 返回与 order内容相同N > 0的 N 维容器,则返回错误代码。BA

笔记:

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

编辑:

我不需要任何完全可用的代码。我在问是否有任何算法可以做到这一点?

标签: c++arraysalgorithmtemplatesmultidimensional-array

解决方案


因此,您只想在不更改数据的情况下重新格式化矩阵。正如我在评论中暗示的那样,最简单的方法是使用一维数组中间步骤将 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);

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

实际上,您不需要将 MD 数组转换为 1D 数组,然后再返回 ND 就足以将索引转换为:

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.

如果你有动态维度,你可以使用:


推荐阅读